TXT文件可以在Heroku上使用流下载,但对于PDF文件-NodeJS,Heroku失败



我无法下载pdf文件并使用"Heroku run bash">在Heroku上查看。但同样的代码也适用于heroku上的txt文件。然而,同样的代码适用于本地机器中的txt和pdf文件。

我有gitclone Heroku Nodejs git存储库(gitclonehttps://github.com/heroku/node-js-getting-started.git)在此处找到(https://devcenter.heroku.com/articles/getting-started-with-nodejs)并将该应用程序推送到Heroku。

在nodejs项目中添加了fs和https库。

const express = require('express')
const path = require('path')
var fs = require('fs');
const https = require('https');
const AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const URL = "<YOUR_URL>";
const PORT = process.env.PORT || 5000
express()
.use(express.static(path.join(__dirname, 'public')))
.set('views', path.join(__dirname, 'views'))
.set('view engine', 'ejs')
.get('/', (req, res) => res.render('pages/index'))
.get('/test', function(req,res) {  
const file = fs.createWriteStream("XXXXXX-pdf.pdf");
https.get("XXXXX-pdf.pdf", response => {
var stream = response.pipe(file);
stream.on("finish", function() {
console.log("done");
try{
// Create params for putObject call
const objectParams = {
Bucket: "<YOUR_BUCKET>", 
Key: "<YOUR_KEY>", 
ContentLength: headers['content-length'],
Body: stream
};
// Create object upload promise
await s3.putObject(objectParams).promise();
} catch(err){
console.log("ERROR --->" + err)
}
});
});
})
.listen(PORT, () => console.log(`Listening on ${ PORT }`))

"heroku-run-bash"无法可靠地看到刚刚上传的文件,因为无法保证它在同一个heroku-dyno上运行。

heroku上的文件是临时的,只有当dyno处于活动状态时,它们才会持续,而且你也可以获得有限的空间。然而,您可以指望它们存在于创建它们的dyno中足够长的时间来完成对web请求的处理。

因此,正确的解决方案是下载文件,然后直接上传到像AmazonS3这样的持久存储服务。虽然官方的AWS SDK for Node.js没有提供用于上传的流式API,但这很好,因为你可以要求API上传你刚刚下载的文件,所有这些都是在你响应原始网络请求之前,你必须这样做才能正确终止它,避免Node.js应用程序中潜在的套接字耗尽。

最新更新