#! /usr/bin/env perl use strict; use warnings; use CGI; use File::Basename qw( basename ); my $generated_file = "/tmp/x.png"; # here happens the magic and $generated_file is generated my $cgi = CGI->new(); print $cgi->header( '-type' => 'image/png', '-attachment' => basename($generated_file), ); open my $fh, '<', $generated_file or die "open($generated_file) failed: $!"; binmode($fh); # for binary data { local $/ = \1024; # deliver in 1 kiB chunks print $_ for <$fh>; # deliver data } close $fh;