2013-05-23 4 views
0

После некоторых из многочисленных сообщений, относящихся к этой теме я наконец придумал эту версию «сила скачать» Код:Symfony2 принуждая JPG скачать возвращает поврежденный файл

public function downloadAction(Request $request){ 

    $filename= 'test.jpg'; 
    $response = new Response(); 

    $response->headers->set('Content-Type','image/jpg'); 
    $response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '"');   

    $response->sendHeaders(); 
    $response->setContent(file_get_contents($filename)); 

    return $response; 
} 

Теперь, это прекрасно работает с почтовыми файлами (очевидно, используя правильный контент-тип), но для jpg происходит что-то другое. При использовании HexCompare для проверки как оригинального, так и загруженного JPG я обнаружил, что загруженная версия добавляет «EF BB BF» в начале файла. Кажется, этого достаточно для Windows Image Viewer, который заканчивает сообщение о поврежденной ошибке файла.

С другой стороны, тот же загруженное JPG открывает совершенно в Adobe Photoshop (менее строгими, возможно?)

идеи? кто угодно?

Заранее спасибо.

Z

UPDATE: Скачано файлов Zip, используя этот код может быть открыт только с помощью WinRAR или WinZIP, Zip Extract Проводник Windows показывает Коррумпированные сообщение об ошибке файла.

UPDATE2: Хорошо, теперь я знаю проблему. Теперь, как я могу избавиться от этого неприятного «EF BB BF» из результата file_get_content?

ответ

0

Пожалуйста, попробуйте следующее, как было предложено here

// Set headers 
$response->headers->set('Cache-Control', 'private'); 
$response->headers->set('Content-type', mime_content_type($filename)); 
$response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '"'); 
$response->headers->set('Content-length', filesize($filename)); 

// Send headers before outputting anything 
$response->sendHeaders(); 
$response->setContent(readfile($filename)); 

Если вы используете Apache с mod_xsendfile, попробуйте:

return new Response('', 200, array(
    'X-Sendfile'   => $filename, 
    'Content-type'  => 'application/octect-stream', 
    'Content-Disposition' => sprintf('attachment; filename="%s"', $filename)), 
    // ... 
));  

Если вы используете Nginx X-Accel чтения here. и использовать

return new Response('', 200, array(
    'X-Accel-Redirect' => $filename, 
    'Content-type'  => 'application/octect-stream', 
    'Content-Disposition' => sprintf('attachment; filename="%s"', $filename)), 
    // ... 
));  

, чтобы получить больше контроля с Nginx дополнительных доступных опций ...

// ... 
'X-Accel-Limit-Rate' => '1024', 
'X-Accel-Buffering' => 'yes', // yes|no 
'X-Accel-Charset' => 'utf-8', 
// ... 
+0

Не работает nifr. Используя этот подход, загруженный файл получает на несколько сотен килобайт больше, все еще поврежденный вывод, даже для Photoshop. Файл, загруженный исходным кодом, открывается правильно в Photoshop. – Zilos

+0

Примечание: исходный файл jpg для тестирования - только 633 КБ, который отлично открывается в Windows 7 Image Viewer. Сделано некоторое тестирование на 11KB 1x1pix файл, тот же результат. – Zilos

+0

обновил мой ответ :) – nifr