I see that you are writing binary (excel) data to a temp file ($fh), and you used "binmode" on that file handle accordingly. But I don't see how the "$excelFile" file handle was opened. Is the input set to binary mode as well? If not, then that might be the problem.
in reply to Spreadsheet::XLS chokes on CGI uploads
Also, it does seem odd that, when you check whether $excelFile is true, your error message implies that it's a file name, but it must be a file handle in order for the "read()" call to work.