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


75

在Laravel应用程序中,我试图在视图内部实现一个按钮,该按钮可以允许用户下载文件而无需导航到任何其他视图或路径现在我有两个问题:(1)函数抛出以下

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

(2)“下载”按钮不应将用户导航到任何地方,而应仅在同一视图上下载文件,即“我的当前设置”,将视图路由到“ / download”

这是我试图实现的方法:

按键:

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

Answers:


170

尝试这个。

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. *用户可以使用以下方法代替ResponseFacade。但是,我以前的答案,才能既为Laravel 4或5(工作$header阵列结构变化关联数组=>后“的Content-Type”结肠已被删除- -如果我们不这样做那些改变则标题将在错误的方式加入:标头名称将从0,1,...开始。

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

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

1
有什么方法可以返回文件下载并更新视图吗?
贾斯汀

仅下载时可以更改文件权限吗?@Anam
Eswara Reddy

@EswaraReddy,你的意思是飞吗?我不这么认为。
Anam 2014年

如何下载任何类型的文件?
2015年

4
@SazzadTusharKhan刚使用return Response::download($pathToFile);
Anam

40

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"

如果拉入Laravel Collective的Html包,则可以使用Html门面:

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

像魅力一样工作,非常感谢@DutGRIFF,您保存了我的一天。我尝试了5个小时的下载程序,但是却无法正常工作,没有得到任何解决方案,但是当我尝试您的解决方案时,它就像一个魅力。Laravel岩石。
Prasad Patel's

27

在接受的答案中,对于Laravel 4,headers数组的构造不正确。采用:

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

数组实例化的差异可能是由于PHP版本而不是laravel版本;)
ShaneMit

6

这些解决方案中有很多建议建议参考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));
}

您还可以使用其他路径,如 Laravel的辅助函数文档中所述


感谢您的贡献。我收到Http 500错误,但这对我的情况有用。
Redgren Grumbholdt '18

5

使用时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是此问题不需要的其他功能。编辑答案,我会投票赞成,因为提到了LV5 response()->download()
DutGRIFF

3

我认为你可以使用

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

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

这样,您可以确定它是pdf。


2

//尝试下载任何文件。laravel 5. *

//您需要使用外观“ use 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
 HTML link click 
<a class="download" href="{{route('project.download',$post->id)}}">DOWNLOAD</a>


// Route

Route::group(['middleware'=>['auth']], function(){
    Route::get('file-download/{id}', 'PostController@downloadproject')->name('project.download');
});

public function downloadproject($id) {

        $book_cover = Post::where('id', $id)->firstOrFail();
        $path = public_path(). '/storage/uploads/zip/'. $book_cover->zip;
        return response()->download($path, $book_cover
            ->original_filename, ['Content-Type' => $book_cover->mime]);

    }

1

HTML href链接单击:

<a ="{{ route('download',$name->file) }}"> Download  </a>

在控制器中:

public function download($file){
    $file_path = public_path('uploads/cv/'.$file);
    return response()->download( $file_path);
}

途中:

Route::get('/download/{file}','Controller@download')->name('download');

0

这是HTML部分

 <a href="{{route('download',$details->report_id)}}" type="button" class="btn btn-primary download" data-report_id="{{$details->report_id}}" >Download</a>

这是路线:

Route::get('/download/{id}', 'users\UserController@getDownload')->name('download')->middleware('auth');

这是功能:

public function getDownload(Request $request,$id)
{
                $file= public_path(). "/pdf/";  //path of your directory
                $headers = array(
                    'Content-Type: application/pdf',
                );
                 return Response::download($file.$pdfName, 'filename.pdf', $headers);      
}

0

如果您想使用JavaScript下载功能,也可以

 <a onclick=“window.open(‘info.pdf) class="btn btn-large pull-right"><i class="icon-download-alt"> </i> Download Brochure </a>

还记得将info.pdf文件粘贴到项目的公共目录中


0

您可以在控制器内部简单使用: return response()->download($filePath); 快乐编码:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.