Javascript AWS SDK S3上传方法与正文流生成空文件
  我试图从模块fs使用从s3使用ReadableStream的方法上传 。 
  该文档指出可以在Body参数中使用ReadableStream: 
正文 - (缓冲区,类型数组,Blob,字符串,ReadableStream)对象数据。
另外上传方法的描述是:
如果有效负载足够大,则使用智能并行处理部件上载任意大小的缓冲区,blob或流。
另外,在这里:使用nodejs aws sdk将生成的pdf上传到AWS S3 @shivendra说他可以使用ReadableStream并且它可以工作。
这是我的代码:
const fs = require('fs')
const S3 = require('aws-sdk/clients/s3')
const s3 = new S3()
const send = async () => {
  const rs = fs.createReadStream('/home/osman/Downloads/input.txt')
  rs.on('open', () => {
    console.log('OPEN')
  })
  rs.on('end', () => {
    console.log('END')
  })
  rs.on('close', () => {
    console.log('CLOSE')
  })
  rs.on('data', (chunk) => {
    console.log('DATA: ', chunk)
  })
  console.log('START UPLOAD')
  const response = await s3.upload({
    Bucket: 'test-bucket',
    Key: 'output.txt',
    Body: rs,
  }).promise()
  console.log('response:')
  console.log(response)
}
send().catch(err => { console.log(err) })
它得到这个输出:
START UPLOAD
OPEN
DATA: <Buffer 73 6f 6d 65 74 68 69 6e 67>
END
CLOSE
response:
{ ETag: '"d41d8cd98f00b204e9800998ecf8427e"',
  Location: 'https://test-bucket.s3.amazonaws.com/output.txt',
  key: 'output.txt',
  Key: 'output.txt',
  Bucket: 'test-bucket' }
问题是我在S3(output.txt)生成的文件有0字节。
有人知道我做错了什么?
  如果我通过Body上的缓冲区它的作品。 
Body: Buffer.alloc(8 * 1024 * 1024, 'something'), 
但这不是我想要做的。 我希望使用流来生成一个文件并将流传输到S3,只要我生成它。
  这是使用NodeJS ReadableStreams的API接口问题。  只需评论与监听事件'data'相关的代码,即可解决问题。 
const fs = require('fs')
const S3 = require('aws-sdk/clients/s3')
const s3 = new S3()
const send = async () => {
  const rs = fs.createReadStream('/home/osman/Downloads/input.txt')
  rs.on('open', () => {
    console.log('OPEN')
  })
  rs.on('end', () => {
    console.log('END')
  })
  rs.on('close', () => {
    console.log('CLOSE')
  })
  // rs.on('data', (chunk) => {
  //   console.log('DATA: ', chunk)
  // })
  console.log('START UPLOAD')
  const response = await s3.upload({
    Bucket: 'test-bucket',
    Key: 'output.txt',
    Body: rs,
  }).promise()
  console.log('response:')
  console.log(response)
}
send().catch(err => { console.log(err) })
  虽然这是一个奇怪的API,但是当我们收听'data'事件时, ReadableStream启动流动模式(监听事件正在更改发布者/ EventEmitter状态?是的,非常容易出错......)。  出于某种原因,S3需要暂停的 ReadableStream 。  如果在await s3.upload(...)之后将rs.on('data'...) await s3.upload(...)工作目录中。  如果我们在rs.on('data'...) rs.pause()之后放置rs.pause()并且await s3.upload(...) ,它也可以工作。 
现在,它发生了什么? 我还不知道......
但问题解决了,即使没有完全解释。
/home/osman/Downloads/input.txt文件/home/osman/Downloads/input.txt确实存在,并且可以通过node.js进程访问 putObject方法 例:
const fs = require('fs');
const S3 = require('aws-sdk/clients/s3');
const s3 = new S3();
s3.putObject({
  Bucket: 'test-bucket',
  Key: 'output.txt',
  Body: fs.createReadStream('/home/osman/Downloads/input.txt'),
}, (err, response) => {
  if (err) {
    throw err;
  }
  console.log('response:')
  console.log(response)
});
  不知道这将如何与async .. await一起工作,更好地使上传到AWS:S3工作,然后改变流程。 
  更新:尝试通过ManagedUpload直接实现上传 
const fs = require('fs');
const S3 = require('aws-sdk/clients/s3');
const s3 = new S3();
const upload = new S3.ManagedUpload({
  service: s3,
  params: {
    Bucket: 'test-bucket',
    Key: 'output.txt',
    Body: fs.createReadStream('/home/osman/Downloads/input.txt')
  }
});
upload.send((err, response) => {
  if (err) {
    throw err;
  }
  console.log('response:')
  console.log(response)
});
上一篇: Javascript AWS SDK S3 upload method with Body stream generating empty file
