【问题标题】:Can't force the pdf download with express.js无法使用 express.js 强制下载 pdf
【发布时间】:2017-10-29 17:32:19
【问题描述】:

我将 express.js 与 pdfkit 一起使用,尝试生成 pdf 并在网络浏览器中强制下载。

我定义了存储 pdf 的静态位置,但是当我想读取这个位置并下载文件时,什么也没有发生。我也尝试过设置标题,但这没有用。

我读到这可能与服务器和前端运行的端口有关。就我而言,它们是:4200(Angular)和 8080(Node.js)

这是服务器代码的片段:

var downl = doc.pipe(fs.createWriteStream('C:/Users/Martyna/Desktop/test pdfow/out.pdf') );

doc.end();

downl.on('finish', function() {
    res.download('C:/Users/Martyna/Desktop/test pdfow/out.pdf', 'out.pdf');
})

【问题讨论】:

  • 您是如何向客户提出请求的?您在浏览器开发工具的“网络”部分看到了什么:您看到请求了吗?您看到返回的响应了吗?
  • createAuthHeaders() { this.loadToken(); this.options = new RequestOptions({ headers: new Headers({ 'Content-Type': 'application/json', 'authorization': this.authToken }) }); } loadToken() { this.authToken = localStorage.getItem('token'); } testGetId(cv: Cv) { this.createAuthHeaders();返回 this.http.get(this.domain + '/konto-uzytkownika/' + cv.cvId, this.options); }
  • 在我的开发工具中,我得到了正确的响应类型:“application/pdf”,即使我没有在服务器响应中设置它

标签: node.js express pdfkit


【解决方案1】:

您需要在回复中添加以下标题。下载文件而不是查看文件

Content-Type: application/pdf
Content-Disposition: attachment; filename="You_File_Name.pdf"

向浏览器指示应在浏览器中查看文件:

Content-Type: application/pdf
Content-Disposition: inline; filename="You_File_Name.pdf"

【讨论】:

  • 我添加了:res.writeHead(200, { 'Content-Type': 'application/pdf', 'Content-Disposition': 'attachment; filename=out.pdf' });我在控制台中收到错误消息:错误:发送后无法设置标头。
  • 你做错了 - res.set('Content-Type', 'application/pdf'); res.set('Content-Type', '附件; filename="You_File_Name.pdf"'); res.sendFile(__dirname, 'files/out.pdf');
  • 知道了!如您所说设置内容类型和内容处置实际上有帮助,谢谢!我还在客户端站点上将 responseType 指定为 Blob,然后在 http get 方法中我写了这个: testGetId(cv: Cv) { this.createAuthHeaders2(); return this.http.get(this.domain + '/konto-uzytkownika/' + cv.cvId, this.options).subscribe(res => { console.log(res) var blob = new Blob([res.blob ()], {type: 'application/pdf'}); saveAs(blob, "cv.pdf"); }); }
  • 哇哦,太棒了。为什么不接受答案?
  • 对不起,我是stackoverflow的新手,忘记了!完成:)
【解决方案2】:

您只需读取文件并将其作为响应发送即可。 这段代码对我有用!

fs.readFile('C:/Users/Martyna/Desktop/test pdfow/out.pdf',(err,data)=>{
if(err){
  consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=your_file_name_for_client.pdf');

res.send(data)
}
})  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 2012-02-23
    • 2012-05-21
    • 1970-01-01
    • 2017-04-11
    • 2014-11-19
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多