更新时间:2023-11-09 GMT+08:00

高频问题汇总

开发过程中,您有任何问题可以在github上提交issue接口参考文档详细介绍了每个接口的参数和使用方法。

SignatureDoesNotMatch签名不匹配

Status-->403
Code-->SignatureDoesNotMatch

此错误一般是初始化ObsClient时传入的SK有误,解决方法:检查SK,确保正确。

MethodNotAllowed方法不允许

Status-->405
Code-->MethodNotAllowed

此错误一般是请求的OBS服务端未上线ObsClient接口依赖的特性,请联系OBS运维团队进行进一步确认。

网络连接错误

Error: Network Error

此类错误一般有三种原因:

  1. 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确;
  2. 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况;
  3. DNS解析出的OBS服务域名无法访问,解决方法:联系OBS运维团队;
  4. SDK依赖底层库Axios的兼容性问题,解决方法:使用浏览器表单上传,或联系OBS运维团队;

请求超时

timeout of xxx exceeded

此类错误一般有两种原因:

  1. 客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网络健康状况;
  2. 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况;

跨域请求被拦截

Access to XMLHttpRequest at 'xxx' from origin 'xxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

此错误均是由于未配置桶的CORS或配置的CORS有误导致,解决方法:请参考配置桶的CORS章节重新配置桶的CORS。

请求成功但返回结果缺少某些字段

此类错误一般有两种原因:

  1. 在桶的CORS配置中ExposeHeader配置不完整,例如未配置ETag(导致上传对象成功后无法获取ETag值)、未配置x-obs-request-id(导致请求完成后无法获取OBS服务端请求ID)等,解决方法:请参考配置桶的CORS章节重新配置桶的CORS;
  2. 使用了旧版本的SDK,解决方法:升级到最新版本的SDK,可以从这里下载最新版本;

IE浏览器集成SDK后加载报错

SCRIPT5009: 'Promise'未定义

此错误的原因是IE浏览器不支持Promise对象(ES6规范)导致,解决方法有三种:

  1. 程序中使用esdk-obs-browserjs-x.x.x.min.js作为SDK库文件,而不使用esdk-obs-browserjs-without-polyfill-x.x.x.min.js
  2. 对IE浏览器引入第三方库,补齐ES6规范,例如,引入babel-polyfill库;
  3. 使用Chrome、Firefox等完成支持ES6规范的浏览器;

无法获取上传后的ETag值

使用ObsClient.putObject和ObsClient.uploadPart上传文件成功后返回结果中无ETag值,此类错误一般有两种原因:

  1. 桶的CORS配置中ExposeHeader不包含ETag头域,解决方法:按照文档配置桶的CORS为桶配置完整的CORS配置;
  2. 桶的CORS配置中ExposeHeader包含ETag头域,但浏览器的返回结果屏蔽了ETag头域(一般发生在低版本的浏览器),解决方法:升级到高版本且完全支持HTML5的浏览器;

ObsClient未定义

Uncaught ReferenceError: ObsClient is not defined

此类错误一般有三种原因:

  1. 程序中未能正确引入SDK,解决方法:排查程序引入SDK的方式,确认是否正确引入了esdk-obs-browserjs-x.x.x.min.jsesdk-obs-browserjs-without-polyfill-x.x.x.min.js
  2. 程序中引入了AMD规范的模块化组件,例如require.js等,解决方法:使用AMD规范创建ObsClient
  3. 程序中引入的组件与SDK的依赖库冲突(这种场景发生概率较小),解决方法:联系OBS运维团队。

不支持window.File的浏览器上传文件问题

Error: source file must be an instance of window.File or window.Blob

此错误的原因是SDK依赖H5标准提供的window.File实现文件上传,如果使用不支持window.File的浏览器,例如IE8、IE9等,则无法使用ObsClient.putObject和ObsClient.uploadFile上传文件,解决方法:基于表单实现文件上传,具体步骤如下。

  1. 判断浏览器是否支持window.File,示例代码如下:

    function getBrowserInfo() {
           var agent = navigator.userAgent.toLowerCase();
           var regStr_ie = /msie [\d.]+;/gi;
           var regStr_ff = /firefox\/[\d.]+/gi
           var regStr_chrome = /chrome\/[\d.]+/gi;
           var regStr_saf = /safari\/[\d.]+/gi;
           var isIE = agent.indexOf('compatible') > -1 && agent.indexOf('msie' > -1); 
           var isEdge = agent.indexOf('edge') > -1 && !isIE; 
           var isIE11 = agent.indexOf('trident') > -1 && agent.indexOf('rv:11.0') > -1;
           if (isIE) {
                  var reIE = new RegExp('msie (\\d+\\.\\d+);');
                  reIE.test(agent);
                  var fIEVersion = parseFloat(RegExp['$1']);
                  if (fIEVersion == 7) {
                         return 'IE/7';
                  } else if (fIEVersion == 8) {
                         return 'IE/8';
                  } else if (fIEVersion == 9) {
                         return 'IE/9';
                  } else if (fIEVersion == 10) {
                         return 'IE/10';
                  } 
           } 
           // isIE end 
           if (isIE11) {
                  return 'IE/11';
           }
           // Firefox
           if (agent.indexOf('firefox') > 0) {
                  return agent.match(regStr_ff);
           }
           // Safari
           if (agent.indexOf('safari') > 0 && agent.indexOf('chrome') < 0) {
                  return agent.match(regStr_saf);
           }
           // Chrome
           if (agent.indexOf('chrome') > 0) {
                  return agent.match(regStr_chrome);
           }
           return '';
    }
    
    var browserInfo = getBrowserInfo();
    // 判断浏览器是否支持window.File
    var isSupportFileApi = browserInfo !== 'IE/7' && browserInfo !== 'IE/8' && browserInfo !== 'IE/9' && window.File;

  2. 根据步骤1的判断结果,选择合适的上传方式,示例代码如下:

    function postObject(){
       // 使用JS代码提交表单,实现表单上传。
    }
    if(isSupportFileApi){
           // 使用表单上传文件
           return postObject();
    }
    // 创建ObsClient实例
    var obsClient = new ObsClient({
        // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
        // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。
        // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
        access_key_id: process.env.AccessKeyID,
        secret_access_key: process.env.SecretAccessKey,
        //这里以中国-香港为例,其他地区请按实际情况填写
        server: 'https://obs.ap-southeast-1.myhuaweicloud.com'
        
    });
    // 使用SDK的断点续传接口上传文件
    obsClient.uploadFile({
       // 传入请求参数
    }, function (err, result) {
       // 处理回调函数
    });

基于表单上传的文件最大不能超过5GB。

引入CommonJS规范导致未定义

Uncaught (in promise) TypeError: Cannot read property 'CancelToken' of undefined

此错误的原因是程序中引入了CommonJS规范的模块化组件,例如webpack等,解决方法:升级到3.19.5及以上版本SDK。

引入Mock.js导致未定义

Uncaught TypeError: request.upload.addEventListener in not a function

此错误的原因是程序中引入了Mock.js组件对XHR打桩导致,解决方法有两种:

  1. 规避:使用SDK进行上传、下载、断点续传上传时不启用进度条功能;
  2. 替换:替换Mock.js组件,使用能够全部模拟XHR接口的组件;
  3. 扩展:扩展Mock.js组件,补齐Mock.js对XHR不支持的接口。