Just as a little side not to all this, i've finally managed to get it to work using this notation.
print "Content-type: application/vnd.ms-excel\n";
print "Content-Disposition: attachment; filename=$filename\n";
print "\n";
open TMP, "$directory/$filename" or die "Error message here: $!\n";
binmode TMP;
binmode STDOUT;
print <TMP>;
Please note that the first bit just uses the basename of the file, so without the whole directory path. Whereas the second bit uses the $directory path so it's absolute on the file system. This little thing had me stumped for a while there, so thought i'd share incase others have the same problem.
Best of luck,
Tom