是的,我已阅读文档。 :)
我的控制器方法如下:
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
扩展名。 :)
答案 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']));
}
对我来说很好!!