Laravel Download文件也不会在客户端发送文件上触发下载



我正在调用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'(; }}

最新更新