【问题标题】:Angular 7 initiate browser file download from server with AuthorizationAngular 7使用授权从服务器启动浏览器文件下载
【发布时间】:2019-08-27 10:59:57
【问题描述】:

我需要使用 Angular 7 实现以下功能,但我在执行此操作时遇到了一些问题,所以您可能可以在这里帮助我。

我们有一项服务,它返回一些静态文件(pdf),调用该 api 需要授权。所以我使用以下方法调用 API:

  download(uri) {
    this.http.get(uri, {
      headers: {
        'Authorization': 'Bearer ' + token,
        'Accept':'application/pdf'
      }
    }).subscribe(()=>{});

但是这个方法实际上做了什么 - 它首先将内容加载到内存中,然后将其显示在浏览器文件加载的列表中。我想要的 - 首先将文件加载到浏览器内存中,我希望浏览器负责加载该文件并显示下载进度。

如果您需要任何其他详细信息,请告诉我。

附:服务响应标题 Content-Disposition: attachment

【问题讨论】:

    标签: javascript angular download jwt


    【解决方案1】:

    您实际上需要使用 blob,因为您使用的是 ajax 调用。 先安装https://github.com/eligrey/FileSaver.js#readme然后

    import { saveAs } from 'file-saver';
    
    download(uri) {
    this.http.get(uri, {
      headers: {
        'Authorization': 'Bearer ' + token,
         responseType: 'blob' 
      }
    }).subscribe((res)=>{
    var blob = new Blob(res, {type: "application/pdf"});
    saveAs(blob, "file.pdf");
    });
    
    • 您的后端应该返回数组字节

    更新 如果您想接收下载进度事件,您可以添加observe: 'events'download progress

    其他选项

    • 您可以向服务器发送第一个请求 ajax,并在服务器端生成随机 URL 可用于一次下载文件

    • 然后使用这个例子,将接收到的链接传入href,触发点击事件。像这个例子

      function download(filename, link) {
       var element = document.createElement('a');
       element.setAttribute('href', link);
       element.setAttribute('download', filename);
      
       element.style.display = 'none';
       document.body.appendChild(element);
      
       element.click();
      
      document.body.removeChild(element);
      }
      

    【讨论】:

    • 实际上这是我想要避免的,因为它首先将所有内容下载到内存中,但我希望浏览器负责跟踪文件下载的进度,而不是我的应用程序。
    • 您不能直接在静态文件上发送“授权”标头,但您可以通过向 API 发送休息调用来玩转,控制器将检查用户是否有权下载文件和将结果作为数组字节返回
    • 在这种情况下,我仍将负责下载文件,但我希望浏览器会在服务器成功响应后开始下载文件。
    • 其他选项将您的令牌作为查询参数传递,例如 <a [src]="'mypdf.pdf'" [queryParams]="{ token: '12345679'}"> 然后在后端手动验证您的令牌。
    • 这是一个棘手的部分......因为这不是我支持这个 API。那么我是否正确理解没有其他方法可以满足我的要求?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多