阿里云图片上传返回地址有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,搭建一个在线教育视频课程分享网站。
相关文章
|
前端开发
42 # 前端 blob 类型
42 # 前端 blob 类型
71 0
后端返回base64格式数据转excel格式文件并下载
后端返回base64格式数据转excel格式文件并下载
234 0
|
JavaScript 前端开发 应用服务中间件
【前端项目笔记】原生js上传文件及文件转换成base64、blob类型
项目中经常会用到上传图片上传视频等功能,由于后端nginx限制,经常要进行文件转化才能上传,大文件可能还要进行切片上传处理。
650 1
|
存储 JSON 前端开发
前端下载文件以及上传图片预览,顺便了解arrayBuffer和blob
前端下载文件以及上传图片预览,顺便了解arrayBuffer和blob
1139 0
|
29天前
|
前端开发
PDF文件上传转成base64编码并支持预览
PDF文件上传转成base64编码并支持预览
111 12
|
2月前
|
前端开发
后端返回图片二进制流,前端转base64
本文介绍了如何将后端返回的图片二进制流转换为Base64格式,以便在前端使用。通过在axios请求中设置`responseType`为`arraybuffer`,然后使用`btoa`和`Uint8Array`进行转换。
218 5
|
2月前
|
JSON 数据格式
Blob格式转json格式,拿到后端返回的json数据
文章介绍了如何将后端返回的Blob格式数据转换为JSON格式,并处理文件下载和错误提示。
83 0
Blob格式转json格式,拿到后端返回的json数据
|
6月前
excel 图片地址转成图片
excel 图片地址转成图片
124 1
|
Web App开发 前端开发
前端下载文件(Blob)的几种方式使用Blob下载文件
前端下载文件(Blob)的几种方式使用Blob下载文件
568 0
|
前端开发 小程序
钉钉小程序 上传一百张图片的base64给接口该怎么写好,正常写的话应该是前端文件限制了长度,只要太大后面一些全部为null
钉钉小程序 上传一百张图片的base64给接口该怎么写好,正常写的话应该是前端文件限制了长度,只要太大后面一些全部为null