从 http post 请求下载文件 - Angular 6
Download file from http post request - Angular 6
更新为 res.send(数据) 而不是 res.json(数据)
使用 Angular 6 和 NodeJS 我正在做一个 Web 应用程序。
我正在尝试从 http post 请求下载文件。
我这样向服务器发送请求。我从我的组件调用服务中的函数。在组件中,我 susbscribe 得到服务器的答案,当我得到它时,我用响应创建一个新的 Blob,然后我使用 FileSaver 下载 pdf。
现在,当我收到服务器的答复时,客户端将其视为错误,而状态为 200。错误消息是:
"Http failure during parsing for http://localhost:3000/api/experiment/regression"
请参阅下面的屏幕截图。
Component.ts
this.api.postML(this.regression).subscribe(
res => {
console.log(res);
let pdf = new Blob(res.data, { type: "application/pdf" });
let filename = "test.pdf";
FileSaver.saveAs(pdf, filename);
},
err => {
alert("Error to perform the regression");
console.log(err);
}
);
API.Service.ts
public postML(data): Observable<any> {
// Create url
let url = `${baseUrl}${"experiment/regression"}`;
let options = {
headers: { "Content-Type": "application/json", Accept: "application/pdf" }
};
// Call the http POST
return this.http
.post(url, data, options)
.pipe(catchError(this.handleError));
}
然后从服务器,它用发送的数据执行一些代码并生成一个 PDF 文件。
然后,我想将 pdf 作为对客户端的响应发送。
我这样试过:
fs.readFile("/home/user/test.pdf", function(err, data) {
let pdfName = "Report.pdf";
res.contentType("application/pdf");
res.set("Content-Disposition", pdfName);
res.set("Content-Transfer-Encoding", "binary");
console.log(data);
console.log("Send data");
res.status(200);
res.send(data);
});
在客户端,我有答案。控制台日志是:
终于找到了视频教程,很基础。
Node.js 服务器:
const express = require("express");
const router = express.Router();
router.post("/experiment/resultML/downloadReport",downloadReport);
const downloadReport = function(req, res) {
res.sendFile(req.body.filename);
};
Angular 分量:
import { saveAs } from "file-saver";
...
download() {
let filename = "/Path/to/your/report.pdf";
this.api.downloadReport(filename).subscribe(
data => {
saveAs(data, filename);
},
err => {
alert("Problem while downloading the file.");
console.error(err);
}
);
}
Angular 服务:
public downloadReport(file): Observable<any> {
// Create url
let url = `${baseUrl}${"/experiment/resultML/downloadReport"}`;
var body = { filename: file };
return this.http.post(url, body, {
responseType: "blob",
headers: new HttpHeaders().append("Content-Type", "application/json")
});
}
更新为 res.send(数据) 而不是 res.json(数据)
使用 Angular 6 和 NodeJS 我正在做一个 Web 应用程序。 我正在尝试从 http post 请求下载文件。
我这样向服务器发送请求。我从我的组件调用服务中的函数。在组件中,我 susbscribe 得到服务器的答案,当我得到它时,我用响应创建一个新的 Blob,然后我使用 FileSaver 下载 pdf。
现在,当我收到服务器的答复时,客户端将其视为错误,而状态为 200。错误消息是: "Http failure during parsing for http://localhost:3000/api/experiment/regression" 请参阅下面的屏幕截图。
Component.ts
this.api.postML(this.regression).subscribe(
res => {
console.log(res);
let pdf = new Blob(res.data, { type: "application/pdf" });
let filename = "test.pdf";
FileSaver.saveAs(pdf, filename);
},
err => {
alert("Error to perform the regression");
console.log(err);
}
);
API.Service.ts
public postML(data): Observable<any> {
// Create url
let url = `${baseUrl}${"experiment/regression"}`;
let options = {
headers: { "Content-Type": "application/json", Accept: "application/pdf" }
};
// Call the http POST
return this.http
.post(url, data, options)
.pipe(catchError(this.handleError));
}
然后从服务器,它用发送的数据执行一些代码并生成一个 PDF 文件。 然后,我想将 pdf 作为对客户端的响应发送。 我这样试过:
fs.readFile("/home/user/test.pdf", function(err, data) {
let pdfName = "Report.pdf";
res.contentType("application/pdf");
res.set("Content-Disposition", pdfName);
res.set("Content-Transfer-Encoding", "binary");
console.log(data);
console.log("Send data");
res.status(200);
res.send(data);
});
在客户端,我有答案。控制台日志是:
终于找到了视频教程,很基础。
Node.js 服务器:
const express = require("express");
const router = express.Router();
router.post("/experiment/resultML/downloadReport",downloadReport);
const downloadReport = function(req, res) {
res.sendFile(req.body.filename);
};
Angular 分量:
import { saveAs } from "file-saver";
...
download() {
let filename = "/Path/to/your/report.pdf";
this.api.downloadReport(filename).subscribe(
data => {
saveAs(data, filename);
},
err => {
alert("Problem while downloading the file.");
console.error(err);
}
);
}
Angular 服务:
public downloadReport(file): Observable<any> {
// Create url
let url = `${baseUrl}${"/experiment/resultML/downloadReport"}`;
var body = { filename: file };
return this.http.post(url, body, {
responseType: "blob",
headers: new HttpHeaders().append("Content-Type", "application/json")
});
}