【问题标题】:How can I detect the download of a file in angular?如何检测角度文件的下载?
【发布时间】:2019-06-21 07:12:39
【问题描述】:

我在 Angular 7 上工作,我在我的 .Net Core API 中创建了一个控制器,当它被使用时,它会向用户发送一个文件,他可以下载这个文件。

在我的 Angular 应用程序中,我想知道是否可以检测到文件下载的不同事件链接。

我在developper mozilla上看到了这个:

function handleChanged(delta) {
  if (delta.state && delta.state.current === "complete") {
    console.log(`Download ${delta.id} has completed.`);
  }
}

browser.downloads.onChanged.addListener(handleChanged);

我尝试在我的 Angular 应用程序中执行此操作,但是这行代码出现错误消息:

browser.downloads.onChanged.addListener(handleChanged);

感谢您的帮助。

编辑:

我的下载服务:

  generatePDF(elt){
    return this.http.post(`${this.config.catchApiUrl()}PDF`,elt,{responseType : 'blob', reportProgress:true}
    );
  }

我的下载服务调用者:

  onFormSubmit() {
    this.generateService.eltToGeneratePDF(1).subscribe(
      r => {
        this.generateService.generatePDF(r)
        .subscribe(
          r => {
            console.log("yeah")
            saveAs(r)},
          err => console.log(err)
        )
      }      
    )
 }

【问题讨论】:

  • 能否提供错误信息?
  • 也许这个链接可以帮助你stackoverflow.com/a/47034525/9941039
  • 错误是:./node_modules/saucelabs/index.js 未找到模块:错误:无法解析 'C:\Users\Soleyne.Nero 中的 './lib-cov/SauceLabs' \Desktop\Project\intranetApplication\node_modules\saucelabs'
  • 谢谢你,我会在我的 Angular 应用程序中调试下载时看到
  • @MsuArven 嗨,我用我的下载服务编辑我的代码我尝试了你的代码,但它不适用于 saveAs(saveAs 允许用户下载文件)

标签: angular file browser download


【解决方案1】:
  1. 用户单击应开始下载文件的链接。
  2. JS-client (angular) 向服务器发送 AJAX 请求。
  3. 服务器生成 downloadId,放入客户端会话(在服务器端){downloadInfo: {downloadId: 123, status: ID_REQUESTED}} 并以 downloadId 响应。
  4. JS-client通过downloadId生成downloadUrl,并在新窗口/标签页中打开,以便浏览器开始下载。

5 & 6 同时:

5.1。 JS 客户端通过某种信息消息通知用户“将文件保存在某处”。

5.2。 JS 客户端向服务器发送 AJAX 请求 'GET /download/status/?waitForCompletion=yes&timeout=10000'。

5.3。服务器在用户会话中查找 downloadId,检索其状态,并将状态返回给服务器。如果 waitForCompletion=yes 则服务器等待下载完成,但不超过 timeout 毫秒。

6.1。用户按下保存文件,浏览器发送请求下载 url ('GET /download/data/')

6.2。服务器修改用户会话“{downloadInfo: {status:IN_PROGRESS}”中的downloadInfo并开始下载

6.3。下载完成后,服务器将 downloadInfo 更改为 '{status: COMPLETED}'

5.4。响应 'GET /download/status/ 检索状态 'COMPLETED' 的 JS 客户端

以上版本为单次下载,新下载会覆盖downloadInfo,服务器端会话不会被过期下载污染。 如果应用程序应该允许多个并发文件下载(并且需要知道每个人的状态),那么通过 timeout 删除 downloadId 状态:

  • 保持上次访问时间: 'downloadInfo: { downloadId123: {status: ID_REQUESTED, lastAcccessTime: 123456789123456789}, downlaodId124: {...}}'
  • 在某些时候删除过时的项目,例如当服务器访问用户的 downloadInfo 时。

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2020-07-30
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多