pdf - PHP force download, not sending full binary files -
i'm creating protected file download system e-commerce website. using php authenticate user logged in , owns product before downloaded. using example provided php.net manual have run error serving both pdf , png files.
it has worked @ 1 point, during development. we've gone live, seems have broke... fortunately website not running full-force @ moment it's not huge issue right now.
what happening:
you visit download url. verified owner of product, , download starts. appears normal, reviewing headers looks ok. header states content length "229542" (224.16kb), looks ok.
the problem:
when download completes, file size 222 bytes. there no errors displayed, , no php errors/warnings/notices being sent in file or browser. it's if php being terminated, without warnings. if turn debugging on, don't see warnings.
the source file looks this (in notepad++, it's pdf it's binary)
when downloaded, looks this (only 7 lines, compared 2554)
my guess:
i issue header related. maybe caused plugin? shows in chrome's networking console:
response headers:
below response headers. "connection: close" concerns me. not sending header. i'm guessing sent exit
command.
access-control-allow-origin:* cache-control:must-revalidate, post-check=0, pre-check=0 connection:close content-description:file transfer content-disposition:attachment; filename="workbook.pdf" content-length:229542 content-transfer-encoding:binary content-type:application/pdf date:tue, 03 sep 2013 21:16:14 gmt expires:0 pragma:public server:apache x-powered-by:plesklin
i have tried:
turning on php debugging sort of error/warning, don't useful in browser or in downloaded file source.
outputting browser, rather streaming. file still cut short, expect pdf try display in browser's pdf reader - doesn't try. white page bunch of unknown symbols.
using +rb read mode, using
fopen( $file['file'], 'rb' ); echo fread( $fh, filesize( $file['file'] ) ); fclose( $fh );
using
ignore_user_abort(true)
,set_time_limit(0)
no effect (also tried set_time_limit(10000) in case, still nothing)sending
.txt
file. this worked. tried simple 5-byte text file, , again 86.3kb file. both appear have come out same went in. must related binary files...
/* --- $file variable looks like: $file = array( [file] => /var/www/vhosts/my-website/uploads/workbook.pdf [type] => application/pdf [filesize] => 229542 [filename] => workbook.pdf [upload_date] => 1377278303 ); */ // stream file user if (file_exists($file['file'])) { header_remove(); // remove set header header('content-description: file transfer'); header('content-type: ' . $file['type']); header('content-disposition: attachment; filename="'.$filename.'"'); header('content-transfer-encoding: binary'); header('expires: 0'); header('cache-control: must-revalidate, post-check=0, pre-check=0'); header('pragma: public'); header('content-length: ' . $filesize); ob_clean(); flush(); readfile($file['file']); exit; }
i know older thread have solution here.
you have script somewhere in application that's compressing spaces or other characters.
ob_start("sanitize_output");
that problem in 1 scenario noticed. if turn off buffer reduction script (called "sanitize_output" above) .pdf show normally. 2kb's noticed trimmed spacing or cutting out unneeded characters.
Comments
Post a Comment