从node.js发送的字节数组中的angular度下载文件

我觉得我非常接近我想要做的事情。 我在node.js中有以下api get方法,它是从SQL Server数据库中检索文件varbinary(MAX)。 它是在插入之前从base64编码的string转换而来的,因此内容types信息被从string中除去。

的node.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中如何检索并提示下载给用户尚不清楚,也没有太多的帮助/资源在线。 这是我到目前为止在我的服务class。

fileDownload.service.ts

 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函数会生成未知types的文件下载,所以从node.js发送的头文件似乎不会影响文件本身。

会有人能够build议如何在Node中使用Node.js成功发送什么,以便我可以成功下载文件,而不pipetypes如何?

非常感谢。

更新您的代码来调用订阅,而不是地图

我做到了。 我不得不重新调用api调用,以便它将所有文件信息分开发送,以便可以在组件类中将MIMEtypes和文件名分配给客户端上的文件。 出于某种原因,当我试图在api中这么做的时候,这是行不通的,所以这是我的工作。 所以这里是对我有用的东西。

node.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 || {}; }