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.
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.
Comment on Re: Spreadsheet::XLS chokes on CGI uploads