0

有一个非常好的示例可用于通过 aws-sdk-js 库将大文件上传到 s3,但不幸的是,这是使用 nodeJs fs。

有没有办法我们可以在纯 Javascript 中实现同样的事情?这是一个很好的要点,它将大文件分解为较小的块,但是这仍然缺少传递给 asw-sdk-js 上传功能所需的 nodeJs fs 的 .pipe 功能。这是 Node.js 中的相关代码片段。

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) });

Plain JS(非nodeJs)中是否有类似的东西?可用于 Rails。

具体来说,是 Plain JS 中以下行的替代方案。

var body = fs.createReadStream('bigfile').pipe(zlib.createGzip());
4

1 回答 1

-1

您提供的同一链接包含一个用于浏览器的实现,它还使用AWS 客户端 SDK

// Get our File object
var file = $('#file-chooser')[0].files[0];

// Upload the File
var bucket = new AWS.S3({params: {Bucket: 'myBucket'});
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
  $('#results').html(err ? 'ERROR!' : 'UPLOADED.');
});

** 编辑 **

请注意该Body字段的文档包括Blob,这意味着将发生流式传输:

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

如果您想监控进度,您还可以在 AWS 开发工具包的ManagedUpload接口提供的客户端中使用 Event Emitter 约定。这是一个例子:

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.');
})

如果您想在发送到s3.uploadPart之前以块的形式从本地系统中读取文件,您将需要对Blob.slice做一些事情,也许定义一个Pipe Chain

于 2017-10-25T23:50:37.653 回答