Загрузка файлов в laravel с помощью ответа::скачать
В приложении Laravel я пытаюсь создать вид кнопки внутри, который позволит пользователю загружать файл без перехода к какому-либо другому виду или маршруту Теперь у меня есть две проблемы: (1) ниже функция метания
The file "/public/download/info.pdf" does not exist
(2) Кнопка загрузки не должна перемещать пользователя куда угодно, а просто загружать файлы в том же представлении, Мои текущие настройки, перенаправляя представление в "/загрузить"
Вот как я пытаюсь достичь:
Кнопка:
<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);
}
7 answers
Попробуйте это.
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
на ассоциативный массив =>
- двоеточие после удаления "Типа содержимого" - если мы не сделаем эти изменения, то заголовки будут добавлены неправильно: имя заголовка будет ли число начинаться с 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
:
<a href="/download/filename.ext">File Name</a> // update to your own "filename.ext"
Если вы подключили Html-пакет Laravel Collective, вы можете использовать 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);
}
Довольно многие из этих решений предлагают ссылаться на 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 документация
//Попробуйте загрузить любой файл. ларавель 5.*
//вам нужно использовать фасад "использовать подсветку\Http\Ответ";
public function getDownload()
{
//PDF file is stored under project/public/download/info.pdf
$file= public_path(). "/download/info.pdf";
return response()->download($file);
}
Я думаю, что вы можете использовать
$file= public_path(). "/download/info.pdf";
$headers = array(
'Content-Type: ' . mime_content_type( $file ),
);
С этим вы убедитесь, что это pdf.