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

时间:2013-12-06 03:33:22

标签: php laravel laravel-4 laravel-routing

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

12 个答案:

答案 0 :(得分:129)

试试这个。

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

答案 1 :(得分:26)

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

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

答案 2 :(得分:26)

Laravel 5 中的文件下载非常简单。

正如@Ashwani所说,Laravel 5允许file downloads 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's Html package,则可以使用Html外观:

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

答案 3 :(得分:3)

使用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); } ,可以使用以下功能进行下载。

    public PagePivot()
        {
            InitializeComponent();
            pivot.SelectionChanged += new SelectionChangedEventHandler(pivot_SelectionChanged); 
        }

答案 4 :(得分:3)

这些解决方案中有不少建议引用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's helper functions documentation

答案 5 :(得分:2)

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

//你需要使用facade&#34;使用Illuminate \ Http \ Response;&#34;

public function getDownload()
{

//PDF file is stored under project/public/download/info.pdf

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

    return response()->download($file);
}

答案 6 :(得分:2)

我认为您可以使用

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

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

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

答案 7 :(得分:2)

build.gradle

答案 8 :(得分: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');

答案 9 :(得分: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);      
}

答案 10 :(得分: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文件粘贴到项目的公共目录中

答案 11 :(得分:0)

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