Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Object Label Badly Formatted

by Anonymous Monk
on Mar 05, 2005 at 00:12 UTC ( #436820=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I've got an application that accepts PDF file uploads and stores them in a BLOB column in MySQL. Another application pulls data from the database and sends it to the browser. When the database is queried the BLOB column is written to a file in a public HTML directory and a link is sent to the browser.

My problem is that when users click on the link the Acrobat plug-in loads and then errors out with "Object Label Badly Formatted". If I move the PDF to the directory myself then it loads correctly in the browsers. ls -Fla on the directory shows that the two files (uploaded through the application and copied in with Samba) have sizes that differ by 8 bytes (the uploaded file is larger).

Any ideas of where to look? Here's the code that is accepting the upload:
my $pdf_name = $cgi_query->param('event_pdf'); my $pdf = 'EventPDF'; if ($pdf_name){ #A file (supposedly a PDF) has been sent in the + post data. Load it into $pdf for storage in events table binmode($pdf_name); while (<$pdf_name>){ $pdf .= $_; } $pdf = $db->quote($pdf); } my $mime_type; #(Not very robust) type checking for uploaded file. This is depen +dent on the browser behaving $mime_type = $cgi_query->uploadInfo($pdf_name)->{'Content-Type'} i +f $pdf_name; if ($mime_type){ return $self->display_error("Attached file is not a PDF\n") un +less $mime_type eq 'application/pdf'; }


Thanks!
--TWH

Comment on Object Label Badly Formatted
Download Code
Re: Object Label Badly Formatted
by Anonymous Monk on Mar 05, 2005 at 01:00 UTC
    I fixed the problem by changing:
    while (<$pdf_name>){ $pdf .= $_; }

    to:
    $pdf = do {local($/) ; <$pdf_name> };

    but I don't quite understand why that fixes the problem. Any explanation would really be appreciated.
    Thanks!
    --TWH

      I'm not sure that while (<$pdf_name>) works properly in binmode. You should be using read or sysread. In other words, don't read line-by-line when you've just told perl that it's a binary file. The second (new) code snippet doesn't read by line - it slurps the entire file as-is, with no translation. To get your while to work, just set local $/ = \1024 to read in 1024-byte chunks.

Re: Object Label Badly Formatted
by digger (Friar) on Mar 05, 2005 at 02:46 UTC

    You are telling perl to read your pdf line by line, and then putting the line into a variable. With binary data, a byte sequence that looks like a line ending (0A on unix, 0D0A on Windows) could appear anywhere in your file. What you end up with is binary data that is, for lack of a better term, mangled.

    You can get around the problem by doing this

    my $readbuf; while ( read (INF, $readbuf, 32767) # read in (up to) 32k chunks ) {$pdf .= $readbuf}

    Now, instead of reading to a newline, which is probably a random byte somewhere inside the pdf, you are reading in 32k bytes at a time. Your pdf stays in tact, and you shouldn't have any trouble.

    HTH, digger

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://436820]
Approved by Tanktalus
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (11)
As of 2014-07-30 18:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (239 votes), past polls