
# 断点续传上传
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在github上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-browserjs-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。[接口参考文档](https://support.huaweicloud.com/api-obs_browserjs_sdk_api_zh/obs_34_0001.html)详细介绍了每个接口的参数和使用方法。
断点续传上传的原理是将待上传的文件分成若干个分段分别上传，并实时地将每段上传结果统一记录在断点续传记录对象中，仅当所有分段都上传成功时返回上传成功的结果，否则在回调函数中返回错误码提醒用户通过传入断点续传记录对象再次调用接口进行重新上传。
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/caution_3.0-zh-cn.png)
- 断点续传上传接口传入的文件总大小至少要100K以上。
- 浏览器刷新网页后，断点续传会失效，需重新上传文件。
 
您可以通过ObsClient.uploadFile进行断点续传上传。该接口可设置的主要参数如下：
| **参数**           | **作用**                                                                                                                                                                                                                                                                                            |
|:---|:---|
| Bucket           | 桶名。                                                                                                                                                                                                                                                                                               |
| Key              | 对象名。                                                                                                                                                                                                                                                                                              |
| RequestDate      | 指定请求时间。 说明： 当为String类型时，必须符合ISO8601或RFC822规范。                                                                                                                                                                                           |
| SourceFile       | 待上传的源文件（浏览器必须支持FileReader）。                                                                                                                                                                                                                                                                       |
| UploadCheckpoint | 断点续传记录对象，可通过ResumeCallback回调函数获取到。                                                                                                                                                                                                                                                                |
| PartSize         | 分段大小，单位：字节。 取值范围是100KB\~5GB，默认为9MB。                                                                                                                                                                                                                                   |
| TaskNum          | 分段上传时的最大并发数，默认为1。                                                                                                                                                                                                                                                                                 |
| ProgressCallback | 获取上传进度的回调函数。 说明： 该回调函数依次包含三个参数：已上传的字节数、总字节数、已使用的时间（单位：秒）。                                                                                                                                                                                |
| EventCallback    | 获取上传事件的回调函数。 说明： 该回调函数依次包含三个参数：事件类型，事件参数，事件结果。                                                                                                                                                                                        |
| ResumeCallback   | 获取断点续传控制参数的回调函数。 说明： - 该回调函数依次包含两个参数：取消断点续传上传任务控制参数，断点续传记录对象；  - 可以调用取消断点续传上传任务控制参数的cancel方法来暂停断点续传上传任务。   |
   
以下代码展示了如何使用断点续传上传接口上传文件：
```
// 创建ObsClient实例
var obsClient = new ObsClient({
    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
    // 前端本身没有process对象，可以使用webpack类打包工具定义环境变量，就可以在代码中运行了。
    // 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    access_key_id: process.env.AccessKeyID,
    secret_access_key: process.env.SecretAccessKey,
    // 这里以华北-北京四为例，其他地区请按实际情况填写
    server: 'https://obs.cn-north-4.myhuaweicloud.com'
});
var cp;
var hook;
obsClient.uploadFile({
       Bucket : 'bucketname',
       Key : 'objectname',
       SourceFile : document.getElementById('input-file').files[0],
       PartSize : 9 * 1024 * 1024,
       ProgressCallback : function(transferredAmount, totalAmount, totalSeconds){
           console.log(transferredAmount * 1.0 / totalSeconds / 1024);
           console.log(transferredAmount * 100.0 / totalAmount);
           if(hook && (transferredAmount / totalAmount) > 0.5){
               // 暂停断点续传任务
               // hook.cancel();
           }
       },
       EventCallback : function(eventType, eventParam, eventResult){
           // 处理事件响应
       },
       ResumeCallback : function(resumeHook, uploadCheckpoint){
           // 获取取消断点续传上传任务控制参数
           hook = resumeHook;
           // 记录断点
           cp = uploadCheckpoint;
       }
}, function(err, result){
    console.error('Error-->' + err);
    // 出现错误，再次调用断点续传接口，继续上传任务
    if(err){
       obsClient.uploadFile({
          UploadCheckpoint : cp,
          ProgressCallback : function(transferredAmount, totalAmount, totalSeconds){
              console.log(transferredAmount * 1.0 / totalSeconds / 1024);
              console.log(transferredAmount * 100.0 / totalAmount);
          },
          EventCallback : function(eventType, eventParam, eventResult){
             // 处理事件响应
          },
        }, function(err, result){
          if(err){
              console.error('Error-->' + err);
          }else{
              if(result.CommonMsg.Status < 300){
                 console.log('RequestId-->' + result.InterfaceResult.RequestId);
                 console.log('Bucket-->' + result.InterfaceResult.Bucket);
                 console.log('Key-->' + result.InterfaceResult.Key);
                 console.log('Location-->' + result.InterfaceResult.Location);
              }else{
                 console.log('Code-->' + result.CommonMsg.Code);
                 console.log('Message-->' + result.CommonMsg.Message);
              }
        }
      });
    }else {
         console.log('Status-->' + result.CommonMsg.Status);
         if (result.CommonMsg.Status < 300 && result.InterfaceResult) {
                console.log('RequestId-->' + result.InterfaceResult.RequestId);
         }
    }
});
```
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 断点续传上传接口是利用[分段上传](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0507.html)特性实现的，是对分段上传的封装和加强；
- 通过ResumeCallback回调函数来获取断点记录对象，该记录对象中包含sourceFile字段代表待上传的文件，如果浏览器重启后该字段需要调用者重新进行设置。
 
