使用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。