阿里云图片上传返回地址有blob格式问题处理实录

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 阿里云OSS上传图片功能很多人可能对实现过,正常情况下会返回https开头的图片地址.

1.问题描述以及原因分析


   阿里云OSS上传图片功能很多人可能对实现过,正常情况下会返回https开头的图片地址.但是今天业务系统中运营人员反应上传的合同详情页面打开异常,看过服务端的日志之后发现用户上传的图片地址带有blob,线上返回异常图片地址如下:

af9a283072cb25dd7b797683abcf42fa_2ab1c76e0ee04d2bb7ff590403a24ee7.png

   造成这种的现象的原因就是服务端进行多个图片截取时处理异常,导致页面打开失败!现在说下问题处理方式.


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;
                    }
                }


   以上是对于此问题的两种处理方式,这次处理之后经过一段时间测试暂时没有反馈异常的图片上传问题,如果感觉对你有帮助欢迎评论区留言或是点赞收藏!


相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
4月前
电子好书发您分享《阿里云可观测技术峰会演讲实录合辑(下)》
电子好书发您分享《阿里云可观测技术峰会演讲实录合辑(下)》
114 1
|
4月前
电子好书发您分享《阿里云可观测技术峰会演讲实录合辑(上)》
电子好书发您分享《阿里云可观测技术峰会演讲实录合辑(上)》
119 2
|
1月前
|
存储 弹性计算 数据库
阿里云优惠券是什么?2024年阿里云优惠券领取地址及使用教程汇总
阿里云作为国内领先的云计算服务提供商,为广大用户提供了丰富的云产品和解决方案。为了吸引用户上云,阿里云经常推出各种优惠活动,其中最受用户欢迎的就是阿里云优惠券。那么,阿里云优惠券究竟是什么呢?我们又该如何领取它呢?本文将为大家详细解答。
213 2
|
1月前
|
存储 机器人
在阿里云RPA中,你可以通过以下步骤来更改默认唤醒IE浏览器的地址
【2月更文挑战第28天】在阿里云RPA中,你可以通过以下步骤来更改默认唤醒IE浏览器的地址
20 1
|
6月前
|
弹性计算 网络安全
阿里云服务器更换公网IP地址的两种方法
阿里云服务器更换公网IP地址的两种方法
303 0
阿里云服务器更换公网IP地址的两种方法
|
6月前
|
弹性计算
阿里云服务器公网IP地址在哪查看?
阿里云服务器公网IP地址在哪查看?
212 0
|
7月前
|
Windows
阿里云的在线文档中,通常不提供直接导出为PDF或其他文档格式的功能
阿里云的在线文档中,通常不提供直接导出为PDF或其他文档格式的功能
247 1
|
3月前
在使用阿里云OpenAPI的翻译服务时,下载地址的使用是有一定要求的
在使用阿里云OpenAPI的翻译服务时,下载地址的使用是有一定要求的【1月更文挑战第17天】【1月更文挑战第83篇】
35 5
|
3月前
|
存储 安全 Java
springboot把图片上传到阿里云OSS
springboot把图片上传到阿里云OSS
205 0
|
4月前
|
弹性计算
阿里云ECS部署openvpn server无法访问客户端私网地址。
阿里云openvpn服务端无法访问客户端网络,服务器可以ping通openvpn客户端地址,但无法访问客户端后面的网段,确认nat与路由都已添加,并且无任何问题,在服务端抓包发现并没有任何出去的报文,现在搞不定了。。。。。

热门文章

最新文章