现象oss上传失败,但是获取到地址,导致访问ideas时返回404状态码先来看我们写的公共函数oss的上传oss部分代码(string$file,string$object){$ossClient=newOssClient($this->config['accessKeyId'],$this->config['accessKeySecret'],$this->config['endpoint']);$result=$ossClient->uploadFile($this->config['bucket'],ltrim($object,'/'),$file);return$result['oss-request-url'];}从逻辑上讲就是SDK返回result中得到的地址,如果上传失败应该直接抛出异常,再看uploadFile代码部分public函数uploadFile($bucket,$object,$file,$options=NULL){//...省略代码$response=$this->auth($options);$result=newPutSetDeleteResult($response);return$result->getData();}主要方法是$this->auth($options),然后去看看privatefunctionauth($options){//...省略代码try{$request->发送请求();}catch(RequestCore_Exception$e){throw(newOssException('RequestCoreException:'.$e->getMessage()));}$response_header=$request->get_response_hea德();$response_header['oss-request-url']=$requestUrl;$response_header['oss-redirects']=$this->redirects;$response_header['oss-stringtosign']=$string_to_sign;$response_header['oss-requestheaders']=$request->request_headers;$data=newResponseCore($response_header,$request->get_response_body(),$request->get_response_code());//retryifOSSInternalErrorif((integer)$request->get_response_code()===500){if($this->redirects<=$this->maxRetries){//设置每次重试之间的休眠时间.$delay=(integer)(pow(4,$this->redirects)*100000);睡眠($延迟);$this->重定向++;$data=$this->auth($options);}}$this->redirects=0;return$data;}可以看出,该异常只在send_request方法中抛出,只有在curl自身无法请求时(比如无法解析host)才会抛出RequestCore_Exception异常。也就是说如果是业务错误,会正常继续,虽然response_code为500的时候会有重试,但是response对象之前已经创建好了如果不是500错误,或者超过重试次数,就会返回这个对象。最后,无论如何都会返回结果结构。得到result结构后,先判断response_code。代码如下配置['端点']);$result=$ossClient->uploadFile($this->config['bucket'],ltrim($object,'/'),$file);if($result['info']['http_code']!==200){thrownewOssException('上传失败');}return$result['oss-request-url'];}补充参考官方例子没有处理这些情况,例子如下:地址:https://help.aliyun.com/docum...//...省略代码try{$ossClient=newOssClient($accessKeyId,$accessKeySecret,$endpoint);$ossClient->uploadFile($bucket,$object,$filePath);}catch(OssException$e){printf(__FUNCTION__.":FAILED\n");printf($e->getMessage()."\n");返回;}打印(__FUNCTION__。“确定”。“\n”);其他错误码说明见上述文档,文档链接:https://help.aliyun.com/docum...错误码HTTP状态码说明MissingContentLength411请求头没有使用chunked编码,或者没有设置Content-Length参数。InvalidEncryptionAlgorithmError400x-oss-server-side-encryption指定的值无效。值:AES256、KMS或SM4。AccessDenied403添加对象时,用户无权访问配置的桶。NoSuchBucket404添加Object时,设置的Bucket不存在。InvalidObjectName400传入的对象键长度大于1023字节。InvalidArgument400返回该错误的可能原因如下:添加的对象大小超过5GB。x-oss-storage-class等参数取值无效。RequestTimeout400指定了Content-Length,但是没有发送消息体,或者发送的消息体小于指定的大小。在这种情况下,服务器将等待直到请求超时。BadRequest400在请求中指定Content-MD5后,OSS会计算发送数据的MD5值,并与请求中的Content-MD5值进行比较。如果两者不匹配,则返回此错误。KmsServiceNotEnabled403x-oss-server-side-encryption指定为KMS,但没有预购KMS包。FileAlreadyExists409当请求头携带x-oss-forbid-overwrite=true时,表示禁止覆盖同名文件。如果已存在同名文件,则返回此错误。当FileImmutable409Bucket中的数据处于保护状态时,如果尝试删除或修改相应的数据,将返回此错误。
