我正在尝试在VueJs
中作为前端,在Laravel
作为后端中构建一个小型应用程序,在该应用程序中,我在将管理部分中的文件上传到aws-s3
时,将文件的链接存储在数据库中。每个动作都由api调用维护,现在我想将这些下载的选项提供给我的最终用户,因此我正在进行axios调用,如下所示:
downloadPDF(docs){
const documents = {
document: docs
}
axios.post('api/documents-download', documents, {headers: getHeader()}).then(response => {
if(response.status === 200)
{
console.log('Downloaded')
}
})
},
在我的控制器中,我有这样的东西:
public function download(Request $request)
{
$headers = [
'Content-Type' => 'application/pdf',
'Content-Description' => 'File Transfer',
'Content-Disposition' => "attachment; filename=filename.pdf",
];
return response()->download($request->document, 'filename.pdf', $headers);
}
但这会抛出错误:
该文件显然存在并公开,如您所见,上面的url显示了链接的文件。
帮我解决这个问题。谢谢
答案 0 :(得分:4)
这段代码就像从Laravel 7中从S3下载的魅力一样工作:
// $filePath should look like this: some-directory/filename.zip
return redirect(Storage::disk('s3')->temporaryUrl(
$filePath,
now()->addHour(),
['ResponseContentDisposition' => 'attachment']
));
信用至:https://sutherlandboswell.com/force-file-download-from-aws-s3-in-laravel/
答案 1 :(得分:1)
我记得在我的项目中实现了这一点。 让我与您分享示例代码... Laravel已经在documentation
中提供了有关s3Storage
的详细信息
代码:
use Illuminate\Support\Facades\Response as Download;
public function download_config(Config $config)
{
$headers = [
'Content-Type' => 'Content-Type: application/zip',
'Content-Disposition' => 'attachment; filename="'. $config->name .'"',
];
return Download::make(Storage::disk('s3')->get($config->path), Response::HTTP_OK, $headers);
}
我假设您可能在数据库中存储了$config->path
(文件路径)。
要了解更多信息,您可以访问this