Node.js aws sdk.s3.getObject()上的Express在使用createReadStream()管道传输到res时缓冲区为空
有问题的代码,首先不尝试从响应创建读取流:Node.js aws sdk.s3.getObject()上的Express在使用createReadStream()管道传输到res时缓冲区为空,node.js,express,aws-sdk,Node.js,Express,Aws Sdk,有问题的代码,首先不尝试从响应创建读取流: app.get('/dashboard/downloadfile', requiresLogin, (req, res) => { const userid = req.user.id; const filename = req.query['file-name']; db.getFileKey([userid, filename], (keyres) => { const params = { Bucke
app.get('/dashboard/downloadfile', requiresLogin, (req, res) => {
const userid = req.user.id;
const filename = req.query['file-name'];
db.getFileKey([userid, filename], (keyres) => {
const params = {
Bucket: S3_BUCKET,
Key: keyres.rows[0].filekey,
};
res.setHeader('Content-disposition', `attachment; filename=${ filename }`);
res.setHeader('Content-type', 'text/plain');
s3.getObject(params, (awserr, awsres) => {
if(awserr) console.log(awserr);
else console.log(awsres);
});
});
});
app.get('/dashboard/downloadfile', requiresLogin, (req, res) => {
const userid = req.user.id;
const filename = req.query['file-name'];
db.getFileKey([userid, filename], (keyres) => {
const params = {
Bucket: S3_BUCKET,
Key: keyres.rows[0].filekey,
};
res.setHeader('Content-disposition', `attachment; filename=${ filename }`);
res.setHeader('Content-type', 'text/plain');
s3.getObject(params, (awserr, awsres) => {
if(awserr) console.log(awserr);
else console.log(awsres);
}).createReadStream().pipe(res);
});
});
console.log(awsres)的结果代码>
console.log(awsres)的结果代码>
10:26:25 AM web.1{AcceptRanges:'bytes',
上午10:26:25 web.1 |最后修改:2018-07-23T23:27:29.000Z,
上午10:26:25 web.1 |内容长度:2519,
上午10:26:25 web.1 | ETag:“5ebd5ec977c868605a6efe830df8ee0d”,
上午10:26:25 web.1 |内容类型:“文本/普通”,
上午10:26:25 web.1 |元数据:{},
上午10:26:25 web.1 |正文:}
正如在问题中一样,我试图通过管道将文件传输到试图获取路由的客户端。我一辈子都想不出来。不,我无法从客户端开始下载。客户端我正在使用vanilla JS,并使用XMLHttpRequest发出http请求。上传工作正常,我正在使用服务器从aws生成signedurl,然后客户端直接上传到s3Am我只是不了解流是如何工作的?这绝对是可能的。您可以从s3.getObject
中删除回调,只需执行:s3.getObject(params.createReadStream()…
我不知道lib在内部是如何工作的,但您可能无法同时使用回调(返回完整文件)和流。
app.get('/dashboard/downloadfile', requiresLogin, (req, res) => {
const userid = req.user.id;
const filename = req.query['file-name'];
db.getFileKey([userid, filename], (keyres) => {
const params = {
Bucket: S3_BUCKET,
Key: keyres.rows[0].filekey,
};
res.setHeader('Content-disposition', `attachment; filename=${ filename }`);
res.setHeader('Content-type', 'text/plain');
s3.getObject(params, (awserr, awsres) => {
if(awserr) console.log(awserr);
else console.log(awsres);
}).createReadStream().pipe(res);
});
});
10:26:25 AM web.1 | { AcceptRanges: 'bytes',
10:26:25 AM web.1 | LastModified: 2018-07-23T23:27:29.000Z,
10:26:25 AM web.1 | ContentLength: 2519,
10:26:25 AM web.1 | ETag: '"5ebd5ec977c868605a6efe830df8ee0d"',
10:26:25 AM web.1 | ContentType: 'text/plain',
10:26:25 AM web.1 | Metadata: {},
10:26:25 AM web.1 | Body: <Buffer > }