使用Response :: download下载laravel中的文件

在Laravel应用程序中,我试图实现一个button里面的视图,可以让用户下载文件,而无需导航到任何其他视图或路线现在我有两个问题:(1)下面的函数投掷

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

(2)下载button不应该导航到任何地方,而只是下载文件在同一个视图,我目前的设置,路由视图'/下载'

下面是我如何试图实现:

button:

  <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"将不起作用,因为您必须给出完整的物理path。

更新20/05/2016

Laravel 5,5.1,5.2或5. *用户可以使用以下方法而不是Response facade。 然而,我以前的答案将适用于Laravel 4或5.( $header数组结构更改为关联数组=> – “内容types”后的冒号被删除 – 如果我们不做这些更改,那么标题将是以错误的方式添加:标题的名称将从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')); 

从控制器内部。


可重复使用的下载路由/控制器

现在让我们创build一个可重用的文件下载path和控制器,以便我们可以在我们的public/files目录中的任何文件服务器。

创build控制器:

 php artisan make:controller --plain DownloadsController 

app/Http/routes.php创build路线:

 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" 

如果您使用Laravel Collective的Html包 ,则可以使用Html外观:

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

当使用laravel 5使用这个代码,因为你不需要标题。

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

如果您正在使用Fileentry ,则可以使用下面的function进行下载。

 // 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. *

//你需要使用Facade“使用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); } 

这些解决scheme中有不less提出引用Laravel应用程序的public_path()来查找文件。 有时候你会想要控制对文件的访问或提供文件的实时监控。 在这种情况下,您需要保持目录的私密性,并通过控制器类中的方法来限制访问。 下面的方法应该有助于这个:

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

还有其他的path可以使用,在Laravel的帮助函数文档中有描述

我认为你可以使用

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

有了这个,你可以肯定这是一个PDF。