2017-07-03 322 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請求到該路線,並得到了迴應數據,但它是一個沒有意義的字符串 –

相關問題