簡體   English   中英

使用 AWS-SDK-JS 使用普通 Javascript 將大文件作為流上傳到 s3

[英]Upload large files as a stream to s3 with Plain Javascript using AWS-SDK-JS

有一個非常好的示例可用於通過 aws-sdk-js 庫將大文件上傳到 s3,但不幸的是這是使用 nodeJs fs。

有沒有辦法可以在普通 Javascript 中實現相同的功能? 這里還有一個很好的Gist ,它將大文件分解為較小的塊,但是這仍然缺少 nodeJs fs 的 .pipe 功能,它需要傳遞給 asw-sdk-js 上傳功能。 這是 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) });

在普通 JS(非 nodeJs)中是否有類似的東西? 可與 Rails 一起使用。

具體來說,可以替代普通 JS 中的以下行。

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

您提供的同一鏈接包含用於瀏覽器的實現,並且它還使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM