2013-12-06 1 views
42

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

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

(2) кнопки не должны перемещаться пользователю куда угодно скачать и достаточно просто загрузить файлы на ту же точку зрения, мои текущие настройки, маршрутизации вид на «/ скачать»

Вот как Im пытается достигнуть:

Кнопка:

<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); 
} 

ответ

100

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

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" не будет работать, как вы должны дать полный физический путь.

Update 20/05/2016

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

$headers = [ 
       'Content-Type' => 'application/pdf', 
      ]; 

return response()->download($file, 'filename.pdf', $headers); 
+1

Любой способ вернуть файл и обновить представление? – Justin

+0

Могу ли я изменить права доступа к файлам при загрузке? @Anam –

+0

@EswaraReddy, Вы имеете в виду на лету? Я так не думаю. – Anam

26

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

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

разница в создании массива, скорее всего, из-за версии PHP, а не версии laravel;) – ShaneMit

3

При использовании 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);   
} 
+2

Этот ответ был бы полезен, если бы он оставил ненужные части или даже просто расширил их ниже чистого ответа. 'Fileentry' - это другая функция, которая не нужна для этого вопроса. Отредактируйте ответ, и я буду выше, потому что упоминание об ответе LV5s() -> download() '. – DutGRIFF

17

загрузки файла очень просты в Laravel 5.

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

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

с контроллера.


многоразовые Скачать Route/Controller

Теперь давайте многоразовые загрузки файла маршрут и контроллер, поэтому мы можем сервер любого файла в нашем каталоге 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's Html package вы можете использовать Html фасад:

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

Работал как шарм, Большое спасибо @DutGRIFF, Ты спас мой день. Я пробовал эту загрузку в течение 5 часов, но не работал, но у меня не было никакого решения, но когда я попробовал ваше решение, он работал как шарм. Скалы Ларавеля. –

2

// Попробуйте загрузить любой файл. 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); 
} 
2

Некоторые из этих решений предлагают ссылку на 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's helper functions documentation

2

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

$file= public_path(). "/download/info.pdf"; 

$headers = array(
     'Content-Type: ' . mime_content_type($file), 
    ); 

С этим убедитесь, что это pdf.

Смежные вопросы