如何使用 laravel 响应在 ajax 成功下载文件

how to download file in ajax success using laravel response

我正在制作一个 PDF 的 zip 文件,然后在浏览器中下载它。我已经使用了 ajax 并希望收到文件作为响应,以便我可以下载它。

return response()->download(public_path().'/documents/'.$zipName , $zipName, $headers);

this is the response i m getting

我也试过这个方法,但是没有用,不知道我错过了什么。

Laravel 响应:

  $downloadData = [
          'zipFile' => $zipName,
          'headers' => $headers,
          'url' => public_path('documents/').$zipName
        ];
        return response()->json(['status'=>1,'data'=> $downloadData]);

AJAX成功:

  var a = document.getElementById('zipDownload');
                       a.href  = data.data.url;
                       a.target  = '_blank';
                       a.download  = data.data.zipFile;
                       setTimeout(function() {
                         a.click();
                       }, 200);

当我将其粘贴到新选项卡中时,锚点显示文件和下载的正确路径。但是当我触发锚点标签时,它显示 不允许加载本地资源:file:///C:/xampp/htdocs/ems/public/documents/records-20200512002210.zip

尝试在 Laravel 响应中使用它(如果您使用 http://localhost:8000 或类似的东西访问网络应用程序,其中设置了 laravel 应用程序的 public 目录作为文档根目录):

 $downloadData = [
          'zipFile' => $zipName,
          'headers' => $headers,
          'url' => '/documents/'.$zipName
        ];
return response()->json(['status'=>1,'data'=> $downloadData]);

在这里你甚至可以使用 url('/documents/'.$zipName)route() 函数,具体取决于已设置的 configurations/environment 个变量。

file:///C:/xampp/htdocs/ems/public/documents/records-20200512002210.zip是webserver上的文件资源,前端(JS)应该是看不到的。 因此,您要下载的 zip 文件应该相对于 Web 应用程序的 URI 进行访问。

在您的情况下,如果浏览器能够访问 http://localhost:8000/documents/<zip file name>.ziphttp://localhost/ems/documents/<zip file name>.zip 之类的内容,那么您可以继续下一步。