93

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

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

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

这是我试图实现的方式:

按钮:

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

12 回答 12

196

尝试这个。

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"将不起作用,因为您必须提供完整的物理路径。

2016 年 5 月 20 日更新

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);
于 2013-12-06T04:08:34.410 回答
46

在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') !!}
于 2016-01-26T16:28:17.333 回答
28

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

$headers = array(
  'Content-Type' => 'application/pdf',
);
于 2014-02-19T17:44:07.480 回答
7

使用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);           
}
于 2015-10-27T13:05:33.707 回答
7

这些解决方案中有不少建议引用 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 的辅助函数文档中进行了描述

于 2017-02-15T20:19:25.573 回答
5

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');
于 2020-09-01T05:18:43.723 回答
4

我认为你可以使用

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

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

有了这个,你可以确定这是一个 pdf。

于 2017-05-02T18:33:15.407 回答
2

// 试试这个来下载任何文件。拉拉维尔 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);
}
于 2016-08-08T03:45:55.150 回答
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]);

    }
于 2020-01-12T07:17:39.193 回答
0

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

于 2020-01-09T03:19:35.930 回答
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 文件粘贴到项目的公共目录中

于 2019-12-03T00:00:23.053 回答
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);      
}
于 2018-12-27T11:40:09.297 回答