我正在调用laravel控制器中的一个方法,该方法返回一个我想要下载到浏览器的文件。该文件是音频文件。下面是控制器:
public function getAudioFile(Request $request)
{
//This is the id we are looking to pull
$uid = $request->uniqueid;
$audioServices = new AudioServices();
$pathToFile = $audioServices->getWavFile($uid);
$name = $uid . '.wav';
return Response::download($pathToFile, $name);
}一切都很好。并将文件返回给浏览器,但它不会在浏览器中触发实际的下载文件事件。响应只是驻留在内存中。下面是生成的响应:
Accept-Ranges: none
Cache-Control: public
Connection: keep-alive
Content-Disposition: attachment; filename=1563974948.9449586.wav
Content-Length: 6409004
Content-Type: audio/x-wav
Date: Mon, 29 Jul 2019 18:23:47 GMT
Last-Modified: Mon, 29 Jul 2019 18:23:44 GMT
Server: nginx/1.14.0 (Ubuntu)
<snip>如果我尝试预览响应,我可以看到wav文件的二进制数据。但是,firefox和chrome实际上都没有‘打包’该文件并将其存储在它们的下载目录中。
我确信我错过了一些小东西,但我已经花了两个小时没有取得任何进展。有什么想法吗?
发布于 2019-07-30 03:52:18
我终于发现了问题所在。对控制器的调用来自ajax调用。由于某些原因,当返回的是可下载的文件时,这会导致问题。这个解决方案很笨拙。我将对控制器的每个调用(因为它是一个包含许多文件链接的表)包装在一个表单元素中,并去掉了干净的ajax单击功能。笨拙-但它是有效的。谢谢你的建议。
发布于 2019-07-30 03:34:07
我总是使用头文件,所以客户端浏览器知道内容类型。你能试一次这个吗。
$headers = [ 'Content-Type' => 'audio/wav', ];
return response()->download($pathToFile, $name, $headers);发布于 2019-07-30 18:11:31
//尝试一下
公共函数downloadAudiobook($id) {
if (Auth::user())
{
$userID = Auth::user()->id;
$download = AudiobookDownload::where(['user_id' => $userID, 'audiobooks_id' => $id])->first();
if (empty($download->user_id))
{
$download = new AudiobookDownload;
$download->user_id = $user_id;
$download->audiobooks_id = $id;
$download->save();
}
$audiobook = AudioBook::find($id);
$download = public_path().'/uploads/audiobooks/audiobook_location/' . $audiobook->audiobook_location;return response()->download($download);} else { return redirect()->route(‘->download’)->with(‘validate’,'success');}}
https://stackoverflow.com/questions/57259624
复制相似问题