开发者社区 问答 正文

JavaScript-SDK之如何实现上传文件?

用户可以通过以下方式向OSS中上传文件:

  • 上传本地文件
  • 流式上传
  • 上传Buffer内容
  • 分片上传
  • 断点上传


上传本地文件


通过put接口来上传一个本地文件到OSS: var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var result = yield client.put('object-key', 'local-file');
  console.log(result);
}).catch(function (err) {
  console.log(err);
});



流式上传


通过putStream接口来上传一个Stream中的内容,stream参数可以是任何实现了Readable Stream的对象,包含文件流,网络流等。当使用putStream接口时,SDK默认会发起一个chunked encoding的HTTP PUT请求。如果在options指定了contentLength参数,则不会使用chunked encoding。 var co = require('co');
var OSS = require('ali-oss');
var fs = require('fs');
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  // use 'chunked encoding'
  var stream = fs.createReadStream('local-file');
  var result = yield client.putStream('object-key', stream);
  console.log(result);
  // don't use 'chunked encoding'
  var stream = fs.createReadStream('local-file');
  var size = fs.statSync('local-file').size;
  var result = yield client.putStream(
    'object-key', stream, {contentLength: size});
  console.log(result);
}).catch(function (err) {
  console.log(err);
});



上传Buffer内容


用户也可以通过put接口简单地将Buffer中的内容上传到OSS: var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var result = yield client.put('object-key', new Buffer('hello world'));
  console.log(result);
}).catch(function (err) {
  console.log(err);
});



分片上传


在需要上传的文件较大时,可以通过multipartUpload接口进行分片上传。分片上传的好处是将一个大请求分成多个小请求来执行,这样当其中一些请求失败后,不需要重新上传整个文件,而只需要上传失败的分片就可以了。一般对于大于100MB的文件,建议采用分片上传的方法。 var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var result = yield client.multipartUpload('object-key', 'local-file', {
    progress: function* (p) {
      console.log('Progress: ' + p);
    }
  });
  console.log(result);
}).catch(function (err) {
  console.log(err);
});


上面的progress参数是一个进度回调函数,用于获取上传进度。progress可以是一个generator function(function*),也可以是一个”thunk”: var progress = function (p) {
  return function (done) {
    console.log(p);
    done();
  };
};


断点上传


分片上传提供progress参数允许用户传递一个进度回调,在回调中SDK将当前已经上传成功的比例和断点信息作为参数。为了实现断点上传,可以在上传过程中保存断点信息(checkpoint),发生错误后,再将已保存的checkpoint作为参数传递给multipartUpload,此时将从上次失败的地方继续上传。 var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var checkpoint;
  // retry 5 times
  for (var i = 0; i < 5; i++) {
      var result = yield client.multipartUpload('object-key', 'local-file', {
        checkpoint: checkpoint,
        progress: function* (percentage, cpt) {
          checkpoint = cpt;
        }
      });
      console.log(result);
      break; // break if success
    } catch (err) {
      console.log(err);
    }
  }
}).catch(function (err) {
  console.log(err);
});


上面的代码只是将checkpoint保存在变量中,如果程序崩溃的话就丢失了,用户也可以将它保存在文件中,然后在程序重启后将checkpoint信息从文件中读取出来。

展开
收起
青衫无名 2017-10-19 09:37:34 2295 分享 版权
0 条回答
写回答
取消 提交回答