jeecg-boot中上传图片到华为云obs云存储中
Posted 穆雄雄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jeecg-boot中上传图片到华为云obs云存储中相关的知识,希望对你有一定的参考价值。
大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。
前言
jeecg-boot
框架中,其实对接的功能还是挺多的,其中就有文件云存储服务器,不过是阿里云oss
的,那如果我们使用的是七牛云,或者华为云obs呢?我们需要改哪些内容才能实现上传obs
的目的呢,今天我们就来看看如何使用jeecg-boot
来实现将文件(图片)上传到华为云obs
中。
配置nacos
因为我们用的是微服务版本,所以配置都在nacos
中,如果是普通的boot
版本的话,直接在yml
文件中写配置就行。
nacos
的配置如下:
- 找到
jeecg
节点,修改uploadType
的值:
uploadType: hwobs
记住这个hwobs的值,我们需要在代码中声明一下它,相当于一个变量,这个值必须和代码中声明的那个变量的值一样,不然就找不到了。
- 添加obs节点:
#华为云oss存储配置
obs:
endpoint: obs.cn-xxxxx-9.myhuaweicloud.com
accessKey: KD6BYxxxxxx
secretKey: Zv83xxxxxx
bucketName: xxxxx
staticDomain: xxxxx.obs.cn-xxxxxx-9.myhuaweicloud.com
注意:对应的值需要改成你自己的ak、sk等。
修改POM文件,添加华为云obs的依赖
添加代码如下:
<!--华为云OBS-->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>esdk-obs-java</artifactId>
<version>3.21.8</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
新建OBS工具类ObsBootUtil
package org.jeecg.common.util.oss;
import com.obs.services.ObsClient;
import com.obs.services.model.ObsObject;
import com.obs.services.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.FileItemStream;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.util.CommonUtils;
import org.jeecg.common.util.filter.FileTypeFilter;
import org.jeecg.common.util.filter.StrAttackFilter;
import org.jeecg.common.util.oConvertUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;
/**
* @Description: 华为云 oss 上传工具类(高依赖版)
* @Date: 2019/5/10
* @author: jeecg-boot
*/
@Slf4j
public class ObsBootUtil
private static String endPoint;
private static String accessKeyId;
private static String accessKeySecret;
private static String bucketName;
/**
* oss 工具客户端
*/
private static ObsClient ossClient = null;
public static String getEndPoint()
return endPoint;
public static void setEndPoint(String endPoint)
ObsBootUtil.endPoint = endPoint;
public static String getAccessKeyId()
return accessKeyId;
public static void setAccessKeyId(String accessKeyId)
ObsBootUtil.accessKeyId = accessKeyId;
public static String getAccessKeySecret()
return accessKeySecret;
public static void setAccessKeySecret(String accessKeySecret)
ObsBootUtil.accessKeySecret = accessKeySecret;
public static String getBucketName()
return bucketName;
public static void setBucketName(String bucketName)
ObsBootUtil.bucketName = bucketName;
public static ObsClient getOssClient()
return ossClient;
/**
* 上传文件至华为云 OBS
* 文件上传成功,返回文件完整访问路径
* 文件上传失败,返回 null
*
* @param file 待上传文件
* @param fileDir 文件保存目录
* @return oss 中的相对文件路径
*/
public static String upload(MultipartFile file, String fileDir, String customBucket) throws Exception
//update-begin-author:liusq date:20210809 for: 过滤上传文件类型
FileTypeFilter.fileTypeFilter(file);
//update-end-author:liusq date:20210809 for: 过滤上传文件类型
String filePath;
initOss(endPoint, accessKeyId, accessKeySecret);
StringBuilder fileUrl = new StringBuilder();
String newBucket = bucketName;
if (oConvertUtils.isNotEmpty(customBucket))
newBucket = customBucket;
try
//判断桶是否存在,不存在则创建桶
if (!ossClient.headBucket(newBucket))
ossClient.createBucket(newBucket);
// 获取文件名
String orgName = file.getOriginalFilename();
if ("".equals(orgName) || orgName == null)
orgName = file.getName();
orgName = CommonUtils.getFileName(orgName);
String fileName = !orgName.contains(".")
? orgName + "_" + System.currentTimeMillis()
: orgName.substring(0, orgName.lastIndexOf("."))
+ "_" + System.currentTimeMillis()
+ orgName.substring(orgName.lastIndexOf("."));
if (!fileDir.endsWith(SymbolConstant.SINGLE_SLASH))
fileDir = fileDir.concat(SymbolConstant.SINGLE_SLASH);
//update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
fileDir = StrAttackFilter.filter(fileDir);
//update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
fileUrl.append(fileDir).append(fileName);
filePath = "https://" + newBucket + "." + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl;
PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream());
// 设置权限(公开读)
// ossClient.setBucketAcl(newBucket, CannedAccessControlList.PublicRead);
if (result != null)
log.info("------OSS文件上传成功------" + fileUrl);
catch (Exception e)
e.printStackTrace();
return null;
return filePath;
/**
* 文件上传
*
* @param file 文件
* @param fileDir fileDir
* @return 路径
*/
public static String upload(MultipartFile file, String fileDir) throws Exception
return upload(file, fileDir, null);
/**
* 上传文件至华为云 OBS
* 文件上传成功,返回文件完整访问路径
* 文件上传失败,返回 null
*
* @param file 待上传文件
* @param fileDir 文件保存目录
* @return oss 中的相对文件路径
*/
public static String upload(FileItemStream file, String fileDir)
String filePath;
initOss(endPoint, accessKeyId, accessKeySecret);
StringBuilder fileUrl = new StringBuilder();
try
String suffix = file.getName().substring(file.getName().lastIndexOf('.'));
String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
if (!fileDir.endsWith(SymbolConstant.SINGLE_SLASH))
fileDir = fileDir.concat(SymbolConstant.SINGLE_SLASH);
fileDir = StrAttackFilter.filter(fileDir);
fileUrl.append(fileDir).append(fileName);
filePath = "https://" + bucketName + "." + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl;
PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());
// 设置权限(公开读)
//ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
if (result != null)
log.info("------OSS文件上传成功------" + fileUrl);
catch (IOException e)
e.printStackTrace();
return null;
return filePath;
/**
* 删除文件
*
* @param url 路径
*/
public static void deleteUrl(String url)
deleteUrl(url, null);
/**
* 删除文件
*
* @param url 路径
*/
public static void deleteUrl(String url, String bucket)
String newBucket = bucketName;
if (oConvertUtils.isNotEmpty(bucket))
newBucket = bucket;
String bucketUrl = "https://" + newBucket + "." + endPoint + SymbolConstant.SINGLE_SLASH;
//TODO 暂时不允许删除云存储的文件
//initOss(endPoint, accessKeyId, accessKeySecret);
url = url.replace(bucketUrl, "");
ossClient.deleteObject(newBucket, url);
/**
* 删除文件
*
* @param fileName 文件名称
*/
public static void delete(String fileName)
ossClient.deleteObject(bucketName, fileName);
/**
* 获取文件流
*
* @param objectName 对象名
* @param bucket 桶
* @return 文件流
*/
public static InputStream getOssFile(String objectName, String bucket)
InputStream inputStream = null;
try
String newBucket = bucketName;
if (oConvertUtils.isNotEmpty(bucket))
newBucket = bucket;
initOss(endPoint, accessKeyId, accessKeySecret);
//update-begin---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件----
objectName = ObsBootUtil.replacePrefix(objectName, bucket);
//update-end---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件----
ObsObject ossObject = ossClient.getObject(newBucket, objectName);
inputStream = new BufferedInputStream(ossObject.getObjectContent());
catch (Exception e)
log.info("文件获取失败" + e.getMessage());
return inputStream;
/**
* 获取文件外链
*
* @param bucketName 桶名称
* @param objectName 对项名
* @param expires 日期
* @return 外链
*/
public static String getObjectUrl(String bucketName, String objectName, Date expires)
initOss(endPoint, accessKeyId, accessKeySecret);
try
//update-begin---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件----
objectName = ObsBootUtil.replacePrefix(objectName, bucketName);
//update-end---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件----
if (ossClient.doesObjectExist(bucketName, objectName))
//URL url = ossClient.generatePresignedUrl(bucketName, objectName, expires);
//log.info("原始url : ", url.toString());
//log.info("decode url : ", URLDecoder.decode(url.toString(), "UTF-8"));
//【issues/4023】问题 oss外链经过转编码后,部分无效,大概在三分一;无需转编码直接返回即可 #4023
//return url.toString();
return "";
catch (Exception e)
log.info("文件路径获取失败" + e.getMessage());
return null;
/**
* 初始化 oss 客户端
*/
private static void initOss(String endpoint, String accessKeyId, String accessKeySecret)
if (ossClient == null)
ossClient = new ObsClient(accessKeyId, accessKeySecret, endpoint);
/**
* 上传文件到oss
*
* @param stream 文件流
* @param relativePath 相对路径
* @return 文件路径
*/
public static String upload(InputStream stream, String relativePath)
String filePath = "https://" + bucketName + "." + endPoint + SymbolConstant.SINGLE_SLASH + relativePath;
initOss(endPoint, accessKeyId, accessKeySecret);
PutObjectResult result = ossClient.putObject(bucketName, relativePath, stream);
// 设置权限(公开读)
//ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
if (result != null)
log.info("------OSS文件上传成功------" + relativePath);
return filePath;
/**
* 替换前缀,防止key不一致导致获取不到文件
*
* @param objectName 文件上传路径 key
* @param customBucket 自定义桶
* @return 对象名
* @date 2022-01-20
* @author lsq
*/
private static String replacePrefix(String objectName, String customBucket)
log.info("------replacePrefix---替换前---objectName:", objectName);
String newBucket = bucketName;
if (oConvertUtils.isNotEmpty(customBucket))
newBucket = customBucket;
String path = "https://" + newBucket + "." + endPoint + SymbolConstant.SINGLE_SLASH;
objectName = objectName.replace(path, "");
log.info("------replacePrefix---替换后---objectName:", objectName);
return objectName;
public static String getOriginalUrl(String url)
return url;
新建OBS配置类
代码如下:
package org.jeecg.config.oss;
import org.jeecg.common.util.oss.ObsBootUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 华为云存储 配置
*
* @author: jeecg-boot
*/
@Configuration
public class ObsConfig
@Value("$jeecg.obs.endpoint")
private String endpoint;
@Value("$jeecg.obs.accessKey")
private String accessKeyId;
@Value("$jeecg.obs.secretKey")
private String accessKeySecret;
@Value("$jeecg.obs.bucketName")
private String bucketName;
@Bean
public void initObsBootConfig()
ObsBootUtil.setEndPoint(endpoint);
ObsBootUtil.setAccessKeyId(accessKeyId);
ObsBootUtil.setAccessKeySecret(accessKeySecret);以上是关于jeecg-boot中上传图片到华为云obs云存储中的主要内容,如果未能解决你的问题,请参考以下文章
sscom串口网络数据调试器使用post方法向华为云obs桶上传文件和图片
2021-12-09 spring boot 集成 华为云obs