Скачивание файлов в 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', '[email protected]');
Контроллер:
public function getDownload(){
//PDF file is stored under project/public/download/info.pdf
$file="./download/info.pdf";
return Response::download($file);
}
Ответы
Ответ 1
Попробуйте это.
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);
Ответ 2
В принятом ответе для Laravel 4 массив заголовков построен неправильно. Использование:
$headers = array(
'Content-Type' => 'application/pdf',
);
Ответ 3
Загрузка файлов супер проста в 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}', '[email protected]');
Сделайте способ загрузки в 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
:
<a href="/download/filename.ext">File Name</a> // update to your own "filename.ext"
Если вы втянули пакет Laravel Collective Html, вы можете использовать фасад Html:
{!! Html::link('download/filename.ext', 'File Name') !!}
Ответ 4
При использовании 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);
}
Ответ 5
//Попробуйте загрузить любой файл. laravel 5. *
//вам нужно использовать фасад "Use 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);
}
Ответ 6
Довольно многие из этих решений предлагают ссылку на 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
Ответ 7
Я думаю, что вы можете использовать
$file= public_path(). "/download/info.pdf";
$headers = array(
'Content-Type: ' . mime_content_type( $file ),
);
С этим вы уверены, что это pdf.