Проблемы при загрузке файла из Slim Framework

Я хочу загрузить файл через Slim Framework (причина, по которой я использую Slim Framework, - это то, что я хочу написать простой REST API). Я нашел этот пост: Скачать файл из Slim Framework 2.4 и этого сообщения: http://help.slimframework.com/discussions/questions/359-file-download. Я следовал методу. Вот мой код:

$app->get('/download/:id', 'authenticate', function($id) use ($app)
{ 
 $log = '../download/'.$id.'/myfile.zip';

 $res = $app->response()->headers();
 $res['Content-Description'] = 'File Transfer';
 $res['Content-Type'] = 'application/octet-stream';
 $res['Content-Disposition'] ='attachment; filename=' . basename($log);
 $res['Content-Transfer-Encoding'] = 'binary';
 $res['Expires'] = '0';
 $res['Cache-Control'] = 'must-revalidate';
 $res['Pragma'] = 'public';
 $res['Content-Length'] = filesize($log);

 readfile($log); 

 // NOTE: 
// $response = array();
// $response["error"] = false;
// echoRespnse(200, $response);

});

Я использую приложение Google Chrome Advanced Rest Client для тестирования. Проблема заключается в том, что браузер зависает после загрузки файла. Если я напишу часть примечания в своем исходном коде, браузер не будет снова висеть. Но я получил ошибку "Неожиданный токен Р".

Может ли кто-нибудь помочь? Благодарю.

4 ответа

Попробуйте решение здесь: PHP readfile() добавляет дополнительные байты в загруженный файл.

Вам не хватает вызовов ob_clean, flush и exit.

Проблема может заключаться в дополнительном выходе символов с остальной частью содержимого файла.


Для Slim 3 у меня была битва. Я боролся с этим в Slim 3.0. Я пытался что-то вроде следующего, и бинарный файл pdf отображался на экране.

$header['Content-Description'] = 'File Transfer';
$header['Content-Disposition'] = 'attachment; filename="' .basename("$file") . '"';

// ...
$response = $response->withHeader($header);

Чтобы заставить его работать, вам нужно установить пары ключ/значение, используя $response->withHeader(). И это работает как шарм. Например:

$response = $response->withHeader('Content-Type', 'application/pdf');
$response = $response->withHeader('Content-Description', 'File Transfer');
$response = $response->withHeader('Content-Disposition', 'attachment; filename="' .basename("$file") . '"');
$response = $response->withHeader('Content-Transfer-Encoding', 'binary');
$response = $response->withHeader('Expires', '0');
$response = $response->withHeader('Cache-Control', 'must-revalidate');
$response = $response->withHeader('Pragma', 'public');
$response = $response->withHeader('Content-Length', filesize($file));


возможно, это немного поздно, но вы можете использовать этот пакет для тонкого ответа HTTP файла: https://github.com/mhndev/slim-file-response


Является ли решение выше работы для вас? Здесь мой код, который просто выводит скрытые символы непосредственно в окно браузера:

$app->get('/file/:fileid', function($fileid) use ($app)
{
 $zip = new ZipArchive();
 $zipname = "zipfile3.zip"; // Zip name
 $zip->open($zipname, ZipArchive::CREATE);
 $files = array ( "sprecher_inserts_en_VB.doc" );

 foreach ($files as $file) {
 $path = "uploads/".$file;
 if(file_exists($path)){
 $zip->addFromString(basename($path), file_get_contents($path)); 
 }
 else{
 echo"file does not exist";
 }
 }
 $zip->close();
 // after that, the zip file is on the server and valid when downloaded manually (e.g. by entering its URL directly)

 $res = $app->response()->headers();
 $res['Content-Description'] = 'File Transfer';
 $res['Content-Type'] = 'application/octet-stream';
 $res['Content-Disposition'] ='attachment; filename=' . basename($zipname);
 $res['Content-Transfer-Encoding'] = 'binary';
 $res['Expires'] = '0';
 $res['Cache-Control'] = 'must-revalidate';
 $res['Pragma'] = 'public';
 $res['Content-Length'] = filesize($zipname);

 ob_clean(); 
 flush();
 readfile($zipname); 
 exit();
});

Вывод в окне браузера следующий: ни один диалог загрузки файла не загружается:

licensed under cc by-sa 3.0 with attribution.