0

我正在將我的NodeJS項目遷移到API網關,我無法弄清楚如何從Lambda下載文件。API網關響應使用節點下載文件,PDF製作,無服務器

這是我本地Node項目上的響應代碼片段。

app.get('/downloadPDF', function (req, res) { 
    res.setHeader('Content-disposition', 'attachment; filename=test.pdf'); 
    res.setHeader('Content-type', 'application/pdf'); 
    var PdfPrinter = require('pdfmake'); 
    var printer = new PdfPrinter(fonts); 

    var pdfDoc = printer.createPdfKitDocument(dd); 
    pdfDoc.pipe(res); 
    pdfDoc.end(); 
}); 

管道到響應我能夠找回PDF。

這是我使用無服務器的lambda函數的一個片段。

module.exports.createPDF = (event, context) => { 
    var PdfPrinter = require('pdfmake'); 
    var printer = new PdfPrinter(fonts); 

    var pdfDoc = printer.createPdfKitDocument(dd); 
    pdfDoc.pipe(res); 
    pdfDoc.end(); 
} 

這裏是我的serverless.yml端點

createPDF: 
handler: functions.myFunction 
events: 
    - http: 
     path: services/getPDF 
     method: get 
     response: 
     headers: 
      Content-Type: "'application/pdf'" 
      Content-disposition: "'attachment; filename=test.pdf'" 

我不知道如何LAMBDA去管參考響應對象。那可能嗎?有另一種方法嗎?


更新

我最終通過返回在客戶端上的JSON響應和對編碼的二進制PDF以base64解決這一問題。 注意:在響應映射模板中使用base64解碼不起作用。

示例代碼:

var buffers = []; 
pdfDoc.on('data', buffers.push.bind(buffers)); 

pdfDoc.on('end', function() { 
    var bufCat = Buffer.concat(buffers); 

    var pdfBase64 = bufCat.toString('base64'); 

return cb(null, 
    {"statusCode": 200, 
    "headers": {"Content-Type": "application/json"}, 
    "body": pdfBase64}); 
}); 

回答

1

API網關本身不支持二進制數據。我們的一些客戶已經在Lambda中成功編譯了base64數據,其中包括JSON響應和使用響應映射模板來解碼數據以響應客戶端。

+0

感謝您的建議!不幸的是,我沒有成功走這條路,但它給了我一些反應映射模板的經驗。 – Padawan

1

API Gateway不支持發送二進制響應。作爲替代,您可以讓Lambda將二進制數據存儲在S3中,並通過Location標頭將HTTP重定向到S3對象位置。

+0

偉大的建議,我相信這會工作,但存儲目前不符合要求。我希望這可以幫助別人! – Padawan

相關問題