2017-07-03 105 views
0

我一直在努力这一段时间,似乎无法找到答案,我正在开发一个网站与预算选项,我从客户端发送一个对象到服务器,并且该服务器正在使用PDFKit创建预算的PDF版本,一旦它被创建,我希望实际上将该PDF发送回客户端并触发下载,这是我的做res.download(NodeJS)没有触发在浏览器上下载

客户端代码:

let data = { 
    nombre: this.state.name, 
    email: this.state.email, 
    telefono: this.state.phone, 
    carrito: this.props.budget.cart, 
    subTotal: this.props.budget.subTotal, 
    IVA: this.props.budget.tax, 
    total: this.props.budget.subTotal + this.props.budget.tax 
} 
    axios({ 
    method: 'post', 
    url: 'http://localhost:1337/api/budget', 
    data: data 
    }) 
    .then((response) => { 
     console.log('This is the response', response); 
     window.open('/download') 
    }) 
    .catch((error) => { 
     alert(error); 
    }) 

,使数据转移到我的服务器端代码完美,它看起来像这样

const pdf = require('pdfkit'); 
const fs = require('fs'); 
const path = require('path'); 

exports.makePDFBudget = (req, res) => { 
    let myDoc = new pdf; 
    myDoc.pipe(fs.createWriteStream(`PDFkit/budget.pdf`)); 
    myDoc.font('Times-Roman') 
     .fontSize(12) 
     .text(`${req.body.name} ${req.body.phone} ${req.body.email} ${req.body.cart} ${req.body.subTotal} ${req.body.total} ${req.body.tax}`); 
    myDoc.end() 
} 

这就是创建我的PDF,我现在想要的是,一旦它被创建并且响应被发送回客户端,客户端将打开一个新的窗口,该URL设置为下载PDF,但这并不是因为某些原因而发生的,它打开了新窗口,但下载从未启动,并且它绝对没有错误我是我的节点控制台或浏览器控制台 这是我如何将文件发送到客户端

const fs = require('fs'); 
const path = require('path'); 

exports.downloadPDFBudget = (req, res) => { 
    res.download(__dirname + 'budget.pdf', 'budget.pdf'); 
} 

这就是我的服务器索引看起来像

const bodyParser = require('body-parser'); 
const express = require('express'); 
const app = express(); 
const api = express.Router(); 
const { makePDFBudget } = require('./PDFkit/makePDFBudget.js'); 
const { downloadPDFBudget } = require('./PDFkit/downloadPDFBudget.js') 

app.use(express.static(__dirname + '/../public')); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json({extended: true})); 

api.route('/budget') 
    .post(makePDFBudget) 

api.route('/download') 
    .get(downloadPDFBudget) 

app.use('/api', api); 

const port = 1337; 

app.listen(port); 

console.log('Listening on port ', port); 

module.exports = app; 

回答

0

我只是解决了它,端口在我跑我的客户显然是从我跑我的服务器的不同,所以我不得不打开一个窗口,我的服务器的端口触发下载,我意识到这一点是因为我扔了一个控制台日志本应该做res.download它没有显示的功能。谢谢!

+0

恭喜 – galkin

0
  1. 我想这里的主要问题:

    res.download(__目录名称+ 'budget.jpg', 'budget.pdf');

    制作正确的文件名。你的文件是PDF格式,而不是JPG格式。

  2. 在此代码res.end(Buffer.from('budget.pdf'))您发送字符串,而不是文件内容。但是像你这样的标题想要发送文件。

  3. 最后一个。你的应用程序设计得像你一样只有一个用户。你可以添加userId文件名?或者使用数据库来存储数据并根据请求生成pdf,而不将文件存储到文件系统。

+0

1.是的,JPG是因为我试图用不是PDF的其他文件来检查这是否是问题,但事实并非如此,修复后仍然无法工作(我曾经有这样的) 2.我试图发送PDF请求的响应,但选择只是让客户端打开/下载网址,永远不会摆脱。 3.我想要的方式是,我只想将该PDF发送回客户的浏览器并发送至公司的电子邮件地址的电子邮件,然后将其删除,而无需任何用户或身份验证 我将更新代码以正确的方式 –

+0

Dario,我们解决了您的问题吗? – galkin

+0

不,这并没有解决它,我更新了我的代码,也是问题,但它仍然无法正常工作,我尝试了,而不是打开一个新的窗口/下载URL做一个AJAX请求到该路线,并得到了回应数据,但它是一个没有意义的字符串 –

相关问题