首页 > 解决方案 > 在 Docker 中使用 Angular 和 Express 下载文件

问题描述

我试图让用户下载他们已经上传的文件。我正在使用 Angular 来访问 Node.js REST API。这些文件存储在 Azure 存储中。Angular UI 和 Service 都在服务器上的 docker 容器中运行。

当我在本地尝试此操作时,它在第一次调用在本地 docker 中运行的新服务时起作用,但由于某种原因,每个后续调用都失败了。我现在整天都在做这个,不知道为什么它不能持续工作。

角函数:

Top 函数在组件中,它调用我的 dataService,它对 REST API 进行实际的 GET 调用。这一切在我看来都是对的。

downloadFile(id, type) {
    this._dataService.downloadFile(id).subscribe((x) => {

      let temp: any;
      temp = x;

      let newBlob = new Blob([x as BlobPart], { type: temp.type });
    
      let downloadURL = URL.createObjectURL(newBlob);
      let link = document.createElement('a');
      link.href = downloadURL;
      link.download = type;
      link.click();
    
    });
  }

downloadFile(fileUploadID) {
  
    const httpOptions = {
      responseType: 'blob' as 'json',
      // headers: new HttpHeaders({
      //   'Authorization': this.authKey,
      // })
    };
  
    let uri = "File_Upload/DownloadBlob/" + fileUploadID.toString();
    return this._http.get(this.urlUser() + uri, httpOptions);
  }

这是尝试下载的 REST API 代码。

路线:

router.get('/File_Upload/DownloadBlob/:fileUploadID', function (req, res) {
    //response.sendJson(req, res, {'Excel':filePath});
    controller.sendBlobByFileUpload(req, res, req.params.fileUploadID)
});

控制器:


exports.sendBlobByFileUpload = async function(req, res, fileUploadID){
    let fileUploadRecSet = await model.getFileUploadByID(req, res, fileUploadID);
    console.log(fileUploadRecSet)
    let filename = 'runtime/downloads/'+fileUploadRecSet[0]['File_Name_Source']
    await blob.download(req, res, filename, fileUploadRecSet[0]['Blob_Name'])
    console.log(filename)
    this.sendFile(req, res, `/home/dvtech/src/pst-service/api/${filename}`)
}

exports.sendFile = function (req, res, file) {
    var options = {
        dotfiles: 'deny',
        headers: {
            'Content-Disposition': 'attachment',
            'x-timestamp': Date.now(),
            'x-sent': true,
            'x-filename': file
        }
    };

    res.sendFile(file, options, function (err) {
        if (err) {
            console.log('Error Sending: ', file, ',  err: ', err);
           // next(err);
        } else {
            console.log('Sent:', file);
        }
    });
}

在此处输入图像描述

我一直无法在网上找到任何东西。我所看到的大部分内容都说这段代码可以工作,它确实可以,但在新的服务器重新启动时只有 1 次。

标签: javascriptnode.jsangulardockerexpress

解决方案


推荐阅读