内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我尝试使用node.js中的AWS-SDK下载,修改并重新上传文件到Amazon S3。我对节点是新手,并且在一些Google搜索之后,我选择尝试使用流来实现此逻辑。我通过继承stream.Transform
和提供一个transform
函数创建了一个自定义转换流。我目前的实施是:
// Download and modify file.
var outputStream = s3.getObject(getParams).
createReadStream().
pipe(transformStream);
// Upload modified file by passing outputStream as body to s3.putObject.
// s3.putObjectWrapper is a promise wrapper for the api function putObject.
s3.putObjectWrapper({body: outputStream, ...}).
then((data) => {
logger.debug("Put Success: ", {data: data});
}).
catch((err) => {
logger.error("Put Error: ", {error: err});
});
这会产生以下错误输出:
error: Put Error: message=Cannot determine length of [object Object], objectMode=false, highWaterMark=16384, head=null, tail=null, length=0, length=0, pipes=null, pipesCount=0, flowing=null, ended=false, endEmitted=false, reading=false, sync=false, needReadable=true, emittedReadable=false, readableListening=false, resumeScheduled=false, defaultEncoding=utf8, ranOut=false, awaitDrain=0, readingMore=false, decoder=null, encoding=null, readable=true, domain=null, end=function
怎么办?
s3.upload
:const params = { Bucket: 'bucket', Key: 'Filename', Body: stream }; s3.upload(params, (err, data) => { console.log(err, data); });
s3.putObject
// This will work if you know the length beforehand outputStream.length = getStreamLength(); s3.putObjectWrapper({ body: outputStream })
const writeStream = fs.createWriteStream('/tmp/testing'); var outputStream = s3.getObject(getParams) .createReadStream(). .pipe(transformStream) .pipe(writeStream) writeStream.on('close', () => { const readStream = fs.createReadStream('/tmp/testing'); s3.putObjectWrapper({ body: readStream }) .then(data => { logger.debug("Put Success: ", { data: data }); }) .catch(err => { logger.error("Put Error: ", { error: err }); }); });