华为云对象存储OBS高频问题汇总_云淘科技

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

SignatureDoesNotMatch签名不匹配

Status-->403
Code-->SignatureDoesNotMatch

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

MethodNotAllowed方法不允许

Status-->405
Code-->MethodNotAllowed

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

网络连接错误

Error: Network Error

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

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

请求超时

timeout of xxx exceeded

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

客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网络健康状况;
客户端到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。

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

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

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

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

SCRIPT5009: 'Promise'未定义

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

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

无法获取上传后的ETag值

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

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

ObsClient未定义

Uncaught ReferenceError: ObsClient is not defined

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

程序中未能正确引入SDK,解决方法:排查程序引入SDK的方式,确认是否正确引入了esdk-obs-browserjs-x.x.x.min.jsesdk-obs-browserjs-without-polyfill-x.x.x.min.js
程序中引入了AMD规范的模块化组件,例如require.js等,解决方法:使用AMD规范创建ObsClient;
程序中引入的组件与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上传文件,解决方法:基于表单实现文件上传,具体步骤如下。

判断浏览器是否支持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;

根据步骤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/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'
    
});
// 使用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打桩导致,解决方法有两种:

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

父主题: 问题定位

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家