如何使用Laravel 5强制下载文件?

时间:2015-11-18 11:46:37

标签: php file laravel download laravel-5

是的,我已阅读文档。 :)

我的控制器方法如下:

public function download($id)
{
    $file = $this->fileRepo->find($id);

    $randomDir = md5(time() . $file->id . $file->user->id . str_random());

    mkdir(public_path() . '/files/' . $randomDir);

    $path = public_path() . '/files/' . $randomDir . '/' . $file->name;

    file_put_contents($path, base64_decode($file->data));

    header('Content-Description: File Transfer');

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

从数据库获取BLOB,转换它,将其临时保存在随机文件夹下的公共文件夹中的文件系统上,然后提供下载。邮递员的标题显示如下:

Accept-Ranges → bytes
Access-Control-Allow-Headers → Content-Type, Accept, Authorization, X-Requested-With, Application
Access-Control-Allow-Methods → POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin → *
Cache-Control → public
Connection → close
Content-Description → File Transfer
Content-Disposition → attachment; filename="taxonomy.odt"
Content-Length → 43626
Content-Type → application/vnd.oasis.opendocument.text
Date → Wed, 18 Nov 2015 11:38:36 GMT
Host → localhost:8000
Last-Modified → Wed, 18 Nov 2015 11:38:36 GMT
X-Powered-By → PHP/5.5.9-1ubuntu4.14

我猜所有标题都设置正确,具体取决于所提供的文件类型(在这种情况下为odt)。

我尝试运行此脚本来测试API以供下载:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<script>
  $.ajax({
     url: "http://localhost:8000/api/files/53/download",
    method : "get",
     data : {
     },
     headers: {
      Authorization: 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImNhcnBhcnRzIiwic3ViIjoiMSIsImlzcyI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDAwXC9hcGlcL2F1dGhlbnRpY2F0ZSIsImlhdCI6IjE0NDc4MjQwOTEiLCJleHAiOiIxNDQ3ODc4MDkxIiwibmJmIjoiMTQ0NzgyNDA5MSIsImp0aSI6ImI2MzRiZDY4ZTMyNjA3OWE3OGYzNzlhNGVkYjJlYzRhIn0.oLF71WsOkl5kDdnRBkpKSbDHD_kCk45yONuB_TiIKxc'
     }
  })           
    .done(function (data) {
    // console.log(data);
  })
  .fail(function (jqXHR, textStatus) {
    alert("error: " + textStatus);
  });
</script>

我可以取消注释.done闭包,它会正确记录文件。我尝试了各种各样的文件:json,text,odt等。 JSON显示得很好,文本也是如此。 odt文件有很多奇怪的字符,这是显而易见的原因。但浏览器只是不会弹出下载窗口。为什么?我做错了什么?

PS:我还确保启用了fileinfo扩展名。 :)

3 个答案:

答案 0 :(得分:3)

不需要ajax请求。只需点击此链接:

NSTableView

单击此链接不会重新加载页面。试试吧。

答案 1 :(得分:0)

如果你需要ajax,那么点击下载按钮时只需按照以下步骤操作:

var code = '<form target="iframeDownload" method="post" action="http://localhost:8000/api/files/53/download"><input type="hidden" name="token" value="your_token"></form>';
var $frm = $(code).attr('target', 'iframeDownload').appendTo('body').submit();

如果要传递任何变量,只需将其作为隐藏变量传递给表单。您也可以直接通过URL本身传递令牌。试试吧。

答案 2 :(得分:0)

在刀片模板中

<a href="{!! route('admin.resource.download', array('file'=>$resource['file'])) !!}">{!! $resource['file'] !!}</a>

在routes.php中

Route::get('resource/download',['as' => 'admin.resource.download','uses' => 'ResourceController@download']);

在控制器

public function download(Request $request){
        return response()->download(public_path('uploads/resource/'.$request['file']));  
    }

对我来说很好!!