in reply to woes with multipart attachments

Perhaps a piece of the puzzle: Your magic line Content-Disposition: attachment\; filename=$file is what suggests the filename for the browser. CGI's multipart_start() function does not print this. However, you should be able to pass it yourself:

print multipart_start( -TYPE=>'application/octet-stream', '-Content-Disposition'=>"attachment\; filename=test.tgz", # Have t +o quote the directive here );

An aside: I don't know how, offhand, to determine the current filename using merlyn's code, other than a kludge like $filename = $ARGV[$count++]; since $_ is the contents of each file, not the file's name.

Update: Sorry if this is obvious: Don't forget to try running it from a command-line to debug. That will let you see the exact headers and file contents the script is printing.