开发者社区> 问答> 正文

JavaScript sdk流式上传demo

已解决

展开
收起
2018-06-13 05:52:48 1072 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

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

    以下示例代码中的catch语法,请自行学习下es6 promise、async/await。仔细阅读下sdk的使用方式,传送门

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

    上传本地文件

    通过put接口来上传一个本地文件到OSS:

    1. let OSS = require('ali-oss')
    2. let client = new OSS({
    3. region: '<Your region>',
    4. accessKeyId: '<Your AccessKeyId>',
    5. accessKeySecret: '<Your AccessKeySecret>',
    6. bucket: 'Your bucket name'
    7. });
    8. async function put () {
    9. try {
    10. let result = await client.put('object-key', 'local-file');
    11. console.log(result);
    12. } catch (e) {
    13. console.log(er);
    14. }
    15. }
    16. put();

    流式上传

    通过putStream接口来上传一个Stream中的内容,stream参数可以是任何实现了Readable Stream的对象,包含文件流,网络流等。当使用putStream接口时,SDK默认会发起一个chunked encoding的HTTP PUT请求。如果在options指定了contentLength参数,则不会使用chunked encoding

    1. let OSS = require('ali-oss');
    2. let fs = require('fs');
    3. let client = new OSS({
    4. region: '<Your region>',
    5. accessKeyId: '<Your AccessKeyId>',
    6. accessKeySecret: '<Your AccessKeySecret>',
    7. bucket: 'Your bucket name'
    8. });
    9. async function putStream () {
    10. try {
    11. // use 'chunked encoding'
    12. let stream = fs.createReadStream('local-file');
    13. let result = yield client.putStream('object-key', stream);
    14. console.log(result);
    15. // don't use 'chunked encoding'
    16. let stream = fs.createReadStream('local-file');
    17. let size = fs.statSync('local-file').size;
    18. let result = await client.putStream(
    19. 'object-key', stream, {contentLength: size});
    20. console.log(result);
    21. } catch (e) {
    22. console.log(e)
    23. }
    24. }
    25. putStream();

    上传Buffer内容

    用户也可以通过put接口简单地将Buffer中的内容上传到OSS:

    1. let OSS = require('ali-oss');
    2. let client = new OSS({
    3. region: '<Your region>',
    4. accessKeyId: '<Your AccessKeyId>',
    5. accessKeySecret: '<Your AccessKeySecret>',
    6. bucket: 'Your bucket name'
    7. });
    8. async function putBuffer () {
    9. try {
    10. let result = await client.put('object-key', new Buffer('hello world'));
    11. console.log(result);
    12. } catch (e) {
    13. console.log(e);
    14. }
    15. }
    16. putBuffer();

    分片上传

    在需要上传的文件较大时,可以通过multipartUpload接口进行分片上传。分片上传的好处是将一个大请求分成多个小请求来执行,这样当其中一些请求失败后,不需要重新上传整个文件,而只需要上传失败的分片就可以了。一般对于大于100MB的文件,建议采用分片上传的方法。

    在使用multipartUpload接口如果遇到ConnectionTimeoutError超时问题,业务方需要自己处理超时逻辑。如何处理超时,可以缩小分片大小、加大超时时间、重试请求,或者业务上捕获ConnectionTimeoutError错误,然后给用户提示。

    相关参数:

    • name {String} object 名称
    • file {String|File} file path or HTML5 Web File
    • [options] {Object} 额外参数
      • [checkpoint] {Object} 断点记录点,可以进行断点续传, 如果设置这个参数,上传会从断点开始,如果没有设置,就会重新上传.
      • [parallel] {Number} 并发上传的分片个数
      • [partSize] {Number} 分片大小
      • [progress] {Function} async函数形式, 回调函数包含三个参数
        • (percentage {Number} 进度百分比(0-1之间小数)
        • checkpoint {Object} 断点记录点
        • res {Object}) 单次part成功返回的response
      • [meta] {Object} 用户自定义header meta信息, header前缀 x-oss-meta-
      • [headers] {Object} extra headers, detail see RFC 2616
        • ‘Cache-Control’ 通用消息头被用于在http 请求和响应中通过指定指令来实现缓存机制, e.g.: Cache-Control: public, no-cache
        • ‘Content-Disposition’ 指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地, e.g.: Content-Disposition: somename
        • ‘Content-Encoding’ 用于对特定媒体类型的数据进行压缩, e.g.: Content-Encoding: gzip
        • ‘Expires’ 过期时间, e.g.: Expires: 3600000
    1. let OSS = require('ali-oss')
    2. let client = new OSS({
    3. region: '<Your region>',
    4. accessKeyId: '<Your AccessKeyId>',
    5. accessKeySecret: '<Your AccessKeySecret>',
    6. bucket: 'Your bucket name'
    7. });
    8. async function multipartUpload () {
    9. try {
    10. let result = await client.multipartUpload('object-key', 'local-file', {
    11. progress,
    12. meta: {
    13. year: 2017,
    14. people: 'test'
    15. }
    16. });
    17. console.log(result);
    18. let head = await client.head('object-key');
    19. console.log(head);
    20. } catch (e) {
    21. // 捕获超时异常
    22. if (e.code === 'ConnectionTimeoutError') {
    23. console.log("Woops,超时啦!");
    24. // do ConnectionTimeoutError operation
    25. }
    26. console.log(e)
    27. }
    28. }

    上面的progress参数是一个进度回调函数,用于获取上传进度。progress可以是一个async函数:

    1. const progress = async function (p) {
    2. console.log(p);
    3. };

    上面的meta参数是一个用户自定义的元数据,通过head接口可以获取到object的meta数据。

    断点上传

    分片上传提供progress参数允许用户传递一个进度回调,在回调中SDK将当前已经上传成功的比例和断点信息作为参数。为了实现断点上传,可以在上传过程中保存断点信息(checkpoint),发生错误后,再将已保存的checkpoint作为参数传递给multipartUpload,此时将从上次失败的地方继续上传。

    1. let OSS = require('ali-oss');
    2. let client = new OSS({
    3. region: '<Your region>',
    4. accessKeyId: '<Your AccessKeyId>',
    5. accessKeySecret: '<Your AccessKeySecret>',
    6. bucket: 'Your bucket name'
    7. });
    8. let checkpoint;
    9. async function resumeUpload() {
    10. // retry 5 times
    11. for (let i = 0; i < 5; i++) {
    12. try {
    13. const result = await client.multipartUpload('object-key', filePath, {
    14. checkpoint,
    15. async progress(percentage, cpt) {
    16. checkpoint = cpt;
    17. },
    18. });
    19. console.log(result);
    20. break; // break if success
    21. } catch (e) {
    22. console.log(e);
    23. }
    24. }
    25. }
    26. resumeUpload();

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

    2018-06-17 21:09:20
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript面向对象的程序设计 立即下载
JavaScript异步编程 立即下载
一个跨平台的云服务SDK需要什么 立即下载