Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download files in laravel using Response::download

In Laravel application I'm trying to achieve a button inside view that can allow user to download file without navigating to any other view or route Now I have two issues: (1) below function throwing

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

(2) Download button should not navigate user to anywhere and rather just download files on a same view, My current settings, routing a view to '/download'

Here is how Im trying to achieve:

Button:

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

Route :

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

Controller :

public function getDownload(){         //PDF file is stored under project/public/download/info.pdf         $file="./download/info.pdf";         return Response::download($file); } 
like image 420
DPP Avatar asked Dec 06 '13 03:12

DPP


People also ask

How do you make a laravel file downloadable?

Downloading files in Laravel is even more simple than uploading. You can pass download() method with file path to download file. Same way, if you want to download file from the public folder, you can use download() method from Response class.


2 Answers

Try this.

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"will not work as you have to give full physical path.

Update 20/05/2016

Laravel 5, 5.1, 5.2 or 5.* users can use the following method instead of Response facade. However, my previous answer will work for both Laravel 4 or 5. (the $header array structure change to associative array =>- the colon after 'Content-Type' was deleted - if we don't do those changes then headers will be added in wrong way: the name of header wil be number started from 0,1,...)

$headers = [               'Content-Type' => 'application/pdf',            ];  return response()->download($file, 'filename.pdf', $headers); 
like image 170
Anam Avatar answered Sep 23 '22 02:09

Anam


File downloads are super simple in Laravel 5.

As @Ashwani mentioned Laravel 5 allows file downloads with response()->download() to return file for download. We no longer need to mess with any headers. To return a file we simply:

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

from within the controller.


Reusable Download Route/Controller

Now let's make a reusable file download route and controller so we can server up any file in our public/files directory.

Create the controller:

php artisan make:controller --plain DownloadsController 

Create the route in app/Http/routes.php:

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

Make download method in 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);   } } 

Now simply drops some files in the public/files directory and you can server them up by linking to /download/filename.ext:

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

If you pulled in Laravel Collective's Html package you can use the Html facade:

{!! Html::link('download/filename.ext', 'File Name') !!} 
like image 24
DutGRIFF Avatar answered Sep 19 '22 02:09

DutGRIFF