我正在调用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实际上都没有"包装"文件并将其存储在其下载目录中。
我敢肯定我缺少一些小东西,但是我花了两个小时而没有取得任何进展。有什么想法吗?
我终于挖出了问题。对控制器的调用来自AJAX调用。由于某些原因,当返回是可下载的文件时,这会导致问题。解决方案很笨拙。我将每个调用对控制器(因为它是一个具有许多文件链接的表(包装在表单元素中,然后删除了清洁的Ajax点击功能。笨拙 - 但它起作用。感谢您的建议。
我始终使用标题,以便客户端浏览器知道内容类型。您可以尝试一次吗?
$headers = [ 'Content-Type' => 'audio/wav', ];
return response()->download($pathToFile, $name, $headers);
//尝试
公共功能下载audiobook($ id({
如果(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;
返回响应(( ->下载($下载(; } 别的 { 返回redirect(( -> route('login'( -> with('validate','success'(; }}