У меня есть следующая функция, которая получает blob из базы данных и должна возвращать файл в браузер, однако он возвращает поврежденный файл:
$file_data
– это массив с возвращенной строкой из таблицы файлов с блобом, типом контента, последним измененным и другими подобными вещами.
$data
– это компонент blob массива $ file_data.
function header_file($data, $file_data) { $last_modified = gmdate('D, d MYH:i:s', $file_data['unix_last_modified_time'])." GMT"; // if browser question if it's up to date if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { // parse header $if_modified_since = preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']); if ($if_modified_since == $last_modified) { // the browser's cache is still up to date header("HTTP/1.0 304 Not Modified"); header("Cache-Control: max-age=86400, must-revalidate"); exit; } } header("Cache-Control: max-age=86400, must-revalidate"); header("Last-Modified: ".$last_modified); header("Content-Type: ".$file_data['file_upload_type']); // this prevents caching... // yea, lots of hair lost to this one... //header("Content-Length: " . strlen($data)); header("Content-Transfer-Encoding: binary"); if($file_data['file_upload_type'] == 'application/x-shockwave-flash') header("Content-Disposition: inline; filename=\"".str_replace(' ','_',$file_data['file_upload_name'])."\""); else header("Content-Disposition: attachment; filename=\"".str_replace(' ','_',$file_data['file_upload_name'])."\""); // send data to output echo $data; exit; }
Перед запуском функции выходной буфер очищается с помощью:
if(ob_get_length() > 0) { ob_clean(); }
Результаты:
Скачивание файлов с правильным размером файла, но оно повреждено. Заданный вопрос: https://stackoverflow.com/questions/19768650/zend-caching-of-images-gives-problems-once-the-site-goes-down-for -какое-то время
Отклик:
Request URL:http://www.example.com/index.php?module=uploads&sub_module=getfile&id=4982 Request Method:GET Status Code:200 OK Request Headersview source Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Cache-Control:no-cache Connection:keep-alive Cookie:banner89=yes; banner90=yes; PHPSESSID=vhlk92ihtcdmtv2q4vhjbmsv54; __utmz=45276912.1383308583.8.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); __utma=45276912.1890999283.1366697926.1383574554.1383631349.15; __utmc=45276912 DNT:1 Host:www.example.com Pragma:no-cache User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36 Query String Parametersview sourceview URL encoded module:uploads sub_module:getfile id:4982 Response Headersview source Cache-Control:max-age=86400, must-revalidate Connection:keep-alive Content-Disposition:attachment; filename="Masthead-Banner.gif" Content-Encoding:gzip Content-Length:5920 Content-Type:image/gif Date:Tue, 05 Nov 2013 09:14:03 GMT Expires:Thu, 19 Nov 1981 08:52:00 GMT Last-Modified:Tue, 05 Nov 2013 08:27:55 GMT Pragma:no-cache Server:Apache Vary:Accept-Encoding X-Cache:MISS from firewall.
Больше исследований:
Открытие загруженного файла и сравнение его с таковым на сервере показывает, что верхний и нижний колонтитулы текста одинаковы, но существует множество символов, которые отличаются:
Настоящая вещь:
%PDF-1.5 %âãÏÓ 165 0 obj <</Linearized 1/L 100758/O 167/E 86272/N 4/T 100409/H [ 498 245]>> endobj 181 0 obj <</DecodeParms<</Columns 5/Predictor 12>>/Filter/FlateDecode/ID[<47941C1B25C34A4EA92EE88606328B32><09EC517E475E964EB1CBEF770BC3C54D>]/Index[165 33]/Info 164 0 R/Length 91/Prev 100410/Root 166 0 R/Size 198/Type/XRef/W[1 3 1]>>stream hÞbbd```b``º"§I~É"Á²`Ĺ,«æ*H®(;D&L@ÿí¿Hþßø h XÊäF¯O ~O 7 endstream endobj startxref 0 %%EOF 197 0 obj <</C 163/Filter/FlateDecode/I 185/Length 151/O 147/S 94>>stream hÞb```¢vV3A Ç%êzů K ULT«Ú1Q5}ukGGGGFGG#Ã#>(f`dàg¬áú¨}À!óÆÄF ?O1x7°30ínÒ@ôHs00íÍa ;Sn$Óu¨*E »!S endstream endobj 166 0 obj <</MarkInfo<</Marked true>>/Metadata 10 0 R/Outlines 14 0 R/PageLayout/OneColumn/Pages 163 0 R/StructTreeRoot 25 0 R/Type/Catalog>> endobj 167 0 obj <</Contents 171 0 R/CropBox[0.0 0.0 612.0 792.0]/MediaBox[0.0 0.0 612.0 792.0]/Parent 163 0 R/Resources<</ColorSpace<</CS0 182 0 R/CS1 183 0 R>>/Font<</C2_0 188 0 R/TT0 190 0 R/TT1 192 0 R/TT2 194 0 R/TT3 196 0 R>>>>/Rotate 0/StructParents 0/Type/Page>> endobj 168 0 obj <</Filter/FlateDecode/First 121/Length 1269/N 15/Type/ObjStm>>stream
Поврежденный:
%PDF-1.5 %âãÏÓ 165 0 obj <</Linearized 1/L 100758/O 167/E 86272/N 4/T 100409/H [ 498 245]>> endobj 181 0 obj <</DecodeParms<</Columns 5/Predictor 12>>/Filter/FlateDecode/ID[<47941C1B25C34A4EA92EE88606328B32><09EC517E475E964EB1CBEF770BC3C54D>]/Index[165 33]/Info 164 0 R/Length 91/Prev 100410/Root 166 0 R/Size 198/Type/XRef/W[1 3 1]>>stream hÞbbd```b``º"§‚I~É"™Á²`Ĺ,«æ*ƒH®(™;D&L'@''ÿˆí¿Hþßø™ h‹ X–'ÊäF¯O ~O 7 endstream endobj startxref 0 %%EOF 197 0 obj <</C 163/Filter/FlateDecode/I 185/Length 151/O 147/S 94>>stream hÞb```¢vV3AŠ dž%êŒzŽÅ–¯ K ™ULT«Ú1Q5}ukGGGGƒFGG#Õ#>(f`dàg¬'áú¨}Àœ!“‹óÆÄF †—?O1x7€•°30ínÒŒ@ôHs00íÍa ;•Sn$Óu¨*E€ »!S endstream endobj 166 0 obj <</MarkInfo<</Marked true>>/Metadata 10 0 R/Outlines 14 0 R/PageLayout/OneColumn/Pages 163 0 R/StructTreeRoot 25 0 R/Type/Catalog>> endobj 167 0 obj <</Contents 171 0 R/CropBox[0.0 0.0 612.0 792.0]/MediaBox[0.0 0.0 612.0 792.0]/Parent 163 0 R/Resources<</ColorSpace<</CS0 182 0 R/CS1 183 0 R>>/Font<</C2_0 188 0 R/TT0 190 0 R/TT1 192 0 R/TT2 194 0 R/TT3 196 0 R>>>>/Rotate 0/StructParents 0/Type/Page>> endobj 168 0 obj <</Filter/FlateDecode/First 121/Length 1269/N 15/Type/ObjStm>>stream
Больше информации:
PDF теперь загружаются правильно … прошибал, но ничего не менял, всегда ctrl +z
последние Откровения:
Пространство добавляется в верхнюю часть файлов, которые искажают изображение … Однако я не знаю, как избавиться от него программным путем.
Это связано с Windows и Unix Line Endings, потому что это веб-сервер на основе unix, где \cr\lf
применяется там, где должен \lf
только \lf
. Следовательно, изображения визуализируются с пространством в начале, которое развращает весь файл.