如何在前端使用Angular从PHP Laravel API下载zip文件?

时间:2018-03-27 05:31:39

标签: php angular laravel laravel-5

我想使用PHP Laravel从服务器下载zip文件。 Laravel通过以下返回命令传递zip文件:

return response()->download($file);

当我在浏览器中点击控制器的路径URL时下载zip文件,当我在Angular中使用window.open(url)时它也会下载zip文件,但它不安全,因为任何人都可以下载文件。用户必须在下载文件之前进行身份验证,但我无法使用window.open(url)传递标头,因此我需要一种不同的方法来实现此目的。

我在这里完成了大部分问题,他们建议使用 FileSaver Blob 。我尝试用这些测试,但没有工作,这是因为API没有将zip文件传递给客户端。

这是Angular http.get:

return http.get('localhost:8000/dashboard/backup')
  .subscribe(res => {
    console.log('Successfull');
  }, err => {
    console.log(err);
  });

我可以获取文件路径,但路径不公开,无法使用Angular下载。该路径以Application / XAMP ....的形式返回。当我将其设置为HREF并单击它时,它将在浏览器中加载为localhost:4200 / Application / XAMP ....

在控制台日志中,我在JSON文件行1中有一个无效字符。为什么zip文件作为JSON传递?

3 个答案:

答案 0 :(得分:2)

使用post方法和responseType arraybuffer

$http.post('localhost:8000/dashboard/backup', {}, {responseType:'arraybuffer'}){
}

答案 1 :(得分:0)

@Sameera建议有效。我添加了responseType并将get更改为post

这是完整的解决方案:

return http.post('localhost:8000/dashboard/backup', {}, {responseType:'arraybuffer'})()
  .subscribe(res => {
    const blob = new Blob([res], {type: 'application/octet-stream'});
    FileSaver.saveAs(blob, 'backup.zip');
  }, err => {
    console.log(err);
});

FileSaver用于保存文件。

答案 2 :(得分:0)

这是正确的,无论你做什么。这是我们如何使用角度和laravel下载zip的唯一方法。但是,您可以管理的安全目的是将您的路由放在预计的中间件中。这样就不会下载未经授权的人。