代码之家  ›  专栏  ›  技术社区  ›  David

从节点发送的字节数组角度下载文件。js公司

  •  1
  • David  · 技术社区  · 8 年前

    我想我已经非常接近我想要做的了。我在node中有以下api get方法。正在从SQL Server数据库检索文件varbinary(MAX)的js。它在插入之前从base64编码的字符串转换而来,因此内容类型信息从字符串中剥离。

    节点。js公司

    router.get('/getFile', (req, res) => {
        console.log("Calling getFile for file " + req.query.serialNumber + ".")
        var serialNumber = req.query.serialNumber;
        let request = new sql.Request(conn);
        request.query('SELECT FileName + \'.\' + FileExtension AS \'File\', FileType, ContentType, SerialNumber, Chart ' +
            'FROM dbo.ChangeFiles ' +
            'WHERE SerialNumber = ' + serialNumber)
            .then(function (recordset) {
                log("Successfully retrieved file " + recordset[0].SerialNumber + " from database.");
                log("Length of blob " + recordset[0].File + " is " + recordset[0].Chart.length)
                res.status(200);
                res.setHeader('Content-Type', recordset[0].ContentType);
                res.setHeader('Content-Disposition', 'attachment;filename=' + recordset[0].File);
                res.end(Buffer.from((recordset[0].Chart)));
            }).catch(function (err) {
                log(err);
                res.status(500).send("Issue querying database!");
            });
    });
    

    这很好,但我不清楚如何从Angular中检索并提示用户下载,也不清楚在线帮助/资源。这是我到目前为止在服务课上学到的东西。

    downloadFile(serialNumber: string): Observable<any> {
        return this.http.get(this.baseURL + '/getFile', { params: { serialNumber: serialNumber } })
        .map(this.extractFile);
    }
    
    
    private extractFile(response: Response) {
        const file = new Blob([response.blob]);
        FileSaver.saveAs(file);
        // const url = window.URL.createObjectURL(file);
        // window.open(url);
        return file;
    }
    

    正如你们所见,我已经尝试了几种方法。extractFile方法的注释部分根本不起作用,并且使用了FileSaver。saveAs函数生成未知类型的文件下载,因此从节点发送头。js似乎没有影响文件本身。

    是否有人能够建议如何从节点成功发送的信息角度进行处理。让我可以成功下载js文件,不管类型是什么?

    提前非常感谢。

    2 回复  |  直到 8 年前
        1
  •  1
  •   David    8 年前

    我终于让它工作了。我不得不修改api调用,使其分别发送所有文件信息,以便MIME类型和文件名可以分配给客户端组件类中的文件。由于某种原因,当我试图在api中完成所有操作时,它不起作用,所以这是我的工作。这就是对我有效的方法。

    节点。js api

    router.get('/getFile', (req, res) => {
        console.log("Calling getFile for file " + req.query.serialNumber + ".")
        var serialNumber = req.query.serialNumber;
        let request = new sql.Request(conn);
        request.query('SELECT FileName + \'.\' + FileExtension AS \'File\', FileType, ContentType, SerialNumber, Chart ' +
            'FROM dbo.ChangeFiles ' +
            'WHERE SerialNumber = ' + serialNumber)
            .then(function (recordset) {
                log("Successfully retrieved file " + recordset[0].SerialNumber + " from database.");
                log("Length of blob " + recordset[0].File + " is " + recordset[0].Chart.length)
                res.send(recordset[0]);
            }).catch(function (err) {
                log(err);
                res.status(500).send("Issue querying database!");
            });
    });
    

      downloadFile(serialNumber: string): void {
        this.changeService.downloadFile(serialNumber).subscribe((res: any) => {
          const ab = new ArrayBuffer(res.Chart.data.length);
          const view = new Uint8Array(ab);
          for (let i = 0; i < res.Chart.data.length; i++) {
            view[i] = res.Chart.data[i];
          }
          const file = new Blob([ab], { type: res.ContentType });
          FileSaver.saveAs(file, res.File);
          console.log(res);
        });
      }
    

    服务等级

    downloadFile(serialNumber: string): Observable<any> {
            return this.http.get(this.baseURL + '/getFile', { params: { serialNumber: serialNumber } })
            .map(this.extractFile);
        }
    
        private extractFile(response: Response) {
            // const file = new Blob([response.blob]);
            // FileSaver.saveAs(file);
            // const url = window.URL.createObjectURL(file);
            // window.open(url);
            const body = response.json();
            return body || {};
        }
    
        2
  •  0
  •   H.abidi    8 年前

    更新代码以调用subscribe而不是map

    推荐文章