使用AWS-SDK-JS使用纯Javascript将大文件作为流上载到s3

使用AWS-SDK-JS使用纯Javascript将大文件作为流上载到s3,javascript,ruby-on-rails,amazon-s3,aws-sdk-js,Javascript,Ruby On Rails,Amazon S3,Aws Sdk Js,通过aws sdk js库将大文件上传到s3有一个非常好的方法,但不幸的是,这是使用nodeJs fs 有没有一种方法可以在普通Javascript中实现同样的功能?这是一个很好的方法,它将大文件分解为较小的块,但是仍然缺少nodeJs fs的.pipe功能,这是传递给asw sdk js upload函数所必需的。下面是节点中的相关代码片段 var fs = require('fs'); var zlib = require('zlib'); var body = fs.createRead

通过aws sdk js库将大文件上传到s3有一个非常好的方法,但不幸的是,这是使用nodeJs fs

有没有一种方法可以在普通Javascript中实现同样的功能?这是一个很好的方法,它将大文件分解为较小的块,但是仍然缺少nodeJs fs的.pipe功能,这是传递给asw sdk js upload函数所必需的。下面是节点中的相关代码片段

var fs = require('fs');
var zlib = require('zlib');

var body = fs.createReadStream('bigfile').pipe(zlib.createGzip());
var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}});
s3obj.upload({Body: body}).
  on('httpUploadProgress', function(evt) {
    console.log('Progress:', evt.loaded, '/', evt.total); 
  }).
  send(function(err, data) { console.log(err, data) });
在普通JS(非nodeJs)中是否有类似的功能?可与Rails一起使用

具体地说,在纯JS中,下面这行的另一个替代品

var body = fs.createReadStream('bigfile').pipe(zlib.createGzip());
它包含一个用于浏览器的实现,并且还使用

**编辑**

注意
Body
字段的文档包括
Blob
,这意味着将发生流式处理:

正文-(缓冲区、类型化数组、Blob、字符串、ReadableStream)

如果需要监视,还可以在AWS SDK接口提供的客户端中使用事件发射器约定。以下是一个例子:

var managed = bucket.upload(params)
managed.on('httpUploadProgress', function (bytes) {
  console.log('progress', bytes.total)
})
managed.send(function (err, data) {
  $('#results').html(err ? 'ERROR!' : 'UPLOADED.');
})

如果您想在发送到之前从本地系统中分块读取文件,您需要做一些事情,可能需要定义一个。

问题是如何将文件作为stream@fgeorgiew好的,挑战是使
Body
符合“流”接口。@fgeorgiw实际上,传递文件对象将导致流。如果要监视传输的进度,请避免回调约定,而首选事件发射器约定。
var managed = bucket.upload(params)
managed.on('httpUploadProgress', function (bytes) {
  console.log('progress', bytes.total)
})
managed.send(function (err, data) {
  $('#results').html(err ? 'ERROR!' : 'UPLOADED.');
})