1.问题描述以及原因分析
阿里云OSS上传图片功能很多人可能对实现过,正常情况下会返回https开头的图片地址.但是今天业务系统中运营人员反应上传的合同详情页面打开异常,看过服务端的日志之后发现用户上传的图片地址带有blob,线上返回异常图片地址如下:
造成这种的现象的原因就是服务端进行多个图片截取时处理异常,导致页面打开失败!现在说下问题处理方式.
2.处理方式说明
咨询过官方客服,反馈说正常情况下oss上传图片不会存在返回类似于blob:XXX格式,提供的处理方式就是判断图片上传是否成功.这里阿里云OSS图片上传使用的是服务端sdk实现,先看下原始的图片上传逻辑:
public String uploadImg(MultipartFile[] multipartFiles) { // 返回多张图片地址 String imgs=""; for (int i = 0; i < multipartFiles.length; i++) { try { String fileName = System.currentTimeMillis()+"_"+multipartFiles[i].getOriginalFilename(); String pathKey=filePath + fileName; // bucketName表示阿里云OSS存储的配置信息:bucketName ossClient.putObject("bucketName", pathKey, new ByteArrayInputStream(multipartFiles[i].getBytes())); if(i < multipartFiles.length-1){ imgs = imgs + aliyunConfig.getUrlPrefix() + pathKey+","; }else { imgs = imgs + aliyunConfig.getUrlPrefix() + pathKey; } } } catch (Exception e) { log.error("图片上传失败:{}",e.getMessage()); throw new Exception("图片上传失败:"+e.getMessage()); } } return imgs; }
关于图片地址是直接进行字符串拼接,没有和阿里云OSS服务进行请求交互,这里的意思可以理解为应用服务端接口请求完成,并不代表阿里云OSS服务端文件存储完成(客户端存在的情况可能是五花八门,无法全部复现),最稳妥的处理方式是请求一下阿里云OSS服务端判断已上传成功的文件与原始的文件是否相同,如果相同则认为是一次有效的上传操作.现在提供两种处理方式,可以根据情况进行选择(两种方式均展示核心上传逻辑).
2.1根据上传返回响应状态
// bucketName表示阿里云OSS存储的配置信息:bucketName PutObjectResult putObjectResult = ossClient.putObject("bucketName", pathKey, new ByteArrayInputStream(multipartFiles[i].getBytes())); if(putObjectResult.getResponse().getStatusCode()==200){ if(i < multipartFiles.length-1){ imgs = imgs + aliyunConfig.getUrlPrefix() + pathKey+","; }else { imgs = imgs + aliyunConfig.getUrlPrefix() + pathKey; } }
注意sdk版本需要升级到:3.15.0,依赖如下:
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.0</version> </dependency>
2.2调用GetObject接口获取下文件的大小
// bucketName表示阿里云OSS存储的配置信息:bucketName ossClient.putObject(aliyunConfig.getBucketName(), pathKey, new ByteArrayInputStream(multipartFiles[i].getBytes())); ObjectMetadata objectMetadata = ossClient.getObject(aliyunConfig.getBucketName(), pathKey).getObjectMetadata(); // 判断已上传文件大小与原始上传文件大小是否相同 if (objectMetadata.getContentLength() == multipartFiles[i].getSize()) { if(i < multipartFiles.length-1){ imgs = imgs + aliyunConfig.getUrlPrefix() + pathKey+","; }else { imgs = imgs + aliyunConfig.getUrlPrefix() + pathKey; } }
以上是对于此问题的两种处理方式,这次处理之后经过一段时间测试暂时没有反馈异常的图片上传问题,如果感觉对你有帮助欢迎评论区留言或是点赞收藏!