Скачивание файлов в laravel с помощью Response :: скачать

В приложении Laravel я пытаюсь создать кнопку внутри представления, которая может позволить пользователю загружать файл без перехода на любой другой вид или маршрут. Теперь у меня есть две проблемы: (1) ниже функции throwing

The file "/public/download/info.pdf" does not exist 

(2) Кнопка загрузки не должна перемещаться по пользователю в любом месте, а просто загружать файлы на одном и том же представлении, Мои текущие настройки, маршрутизировать представление на '/ download'

Вот как я пытаюсь достичь:

Кнопка:

  <a href="/download" class="btn btn-large pull-right"><i class="icon-download-alt"> </i> Download Brochure </a> 

Маршрут:

 Route::get('/download', 'HomeController@getDownload'); 

Контроллер:

 public function getDownload(){ //PDF file is stored under project/public/download/info.pdf $file="./download/info.pdf"; return Response::download($file); } 

Попробуй это.

 public function getDownload() { //PDF file is stored under project/public/download/info.pdf $file= public_path(). "/download/info.pdf"; $headers = array( 'Content-Type: application/pdf', ); return Response::download($file, 'filename.pdf', $headers); } 

"./download/info.pdf" не будет работать так, как вы должны дать полный физический путь.

Обновление 20/05/2016

Пользователи Laravel 5, 5.1, 5.2 или 5. * могут использовать следующий метод вместо фасада Response . Однако мой предыдущий ответ будет работать как для Laravel 4, так и для 5. (структура массива $header изменяется на ассоциативный массив => – двоеточие после «Content-Type» было удалено – если мы не сделаем эти изменения, то заголовки будут добавлено неверно: имя заголовка wil будет начинаться с цифры 0,1, …)

 $headers = [ 'Content-Type' => 'application/pdf', ]; return response()->download($file, 'filename.pdf', $headers); 

В принятом ответе для Laravel 4 массив заголовков построен неправильно. Использование:

 $headers = array( 'Content-Type' => 'application/pdf', ); 

В Laravel 5 файлы загружаются очень просто.

Как сказал @Ashwani, Laravel 5 позволяет загружать файлы с response()->download() чтобы вернуть файл для загрузки. Нам больше не нужно возиться с заголовками. Чтобы вернуть файл, мы просто:

 return response()->download(public_path('file_path/from_public_dir.pdf')); 

из контроллера.


Многоразовый загружаемый маршрут / контроллер

Теперь давайте создадим многоразовый путь загрузки файлов и контроллер, чтобы мы могли обслуживать любой файл в нашем каталоге public/files .

Создайте контроллер:

 php artisan make:controller --plain DownloadsController 

Создайте маршрут в app/Http/routes.php :

 Route::get('/download/{file}', 'DownloadsController@download'); 

Сделать способ загрузки в app/Http/Controllers/DownloadsController :

 class DownloadsController extends Controller { public function download($file_name) { $file_path = public_path('files/'.$file_name); return response()->download($file_path); } } 

Теперь просто отбрасывает некоторые файлы в каталоге public/files и вы можете их /download/filename.ext связав /download/filename.ext :

 <a href="/download/filename.ext">File Name</a> // update to your own "filename.ext" 

Если вы вытащили пакет Larvel Collective's Html, вы можете использовать фасад Html:

 {!! Html::link('download/filename.ext', 'File Name') !!} 

При использовании laravel 5 используйте этот код, поскольку вам не нужны заголовки.

return response()->download($pathToFile); ,

Если вы используете Fileentry вы можете использовать функцию ниже для загрузки.

 // download file public function download($fileId){ $entry = Fileentry::where('file_id', '=', $fileId)->firstOrFail(); $pathToFile=storage_path()."/app/".$entry->filename; return response()->download($pathToFile); } 

// Попробуйте загрузить любой файл. laravel 5. *

// вам нужно использовать фасад «использовать Illuminate \ Http \ Response;»

 public function getDownload() { //PDF file is stored under project/public/download/info.pdf $file= public_path(). "/download/info.pdf"; return response()->download($file); } 

Многие из этих решений предлагают ссылаться на public_path () приложения Laravel, чтобы найти файл. Иногда вам нужно контролировать доступ к файлу или предлагать мониторинг файлов в реальном времени. В этом случае вы захотите сохранить личный каталог и ограничить доступ методом в классе контроллера. Следующий способ должен помочь в этом:

 public function show(Request $request, File $file) { // Perform validation/authentication/auditing logic on the request // Fire off any events or notifiations (if applicable) return response()->download(storage_path('app/' . $file->location)); } 

Существуют и другие пути, которые вы могли бы использовать, описанные в документации по вспомогательным функциям Laravel

Я думаю, что вы можете использовать

 $file= public_path(). "/download/info.pdf"; $headers = array( 'Content-Type: ' . mime_content_type( $file ), ); 

С этим вы уверены, что это pdf.