jeecg 您所在的位置:网站首页 华为图片详情在哪里 jeecg

jeecg

2023-07-23 20:50| 来源: 网络整理| 查看: 265

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。

在这里插入图片描述

前言

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的依赖

添加代码如下:

com.huaweicloud esdk-obs-java 3.21.8 com.squareup.okhttp3 okhttp 新建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); ObsBootUtil.setBucketName(bucketName); } } 声明配置变量

在CommonConstant接口中声明在nacos中配置的变量:

String UPLOAD_TYPE_OBS = "hwobs";

在这里插入图片描述

修改原来文件上传的方法

首先找到类CommonUtils,的uploadOnlineImage方法,修改成如下: 在这里插入图片描述

public static String uploadOnlineImage(byte[] data, String basePath, String bizPath, String uploadType) { String dbPath = null; String fileName = "image" + Math.round(Math.random() * 100000000000L); fileName += "." + PoiPublicUtil.getFileExtendName(data); try { if (CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)) { File file = new File(basePath + File.separator + bizPath + File.separator); if (!file.exists()) { file.mkdirs();// 创建文件根目录 } String savePath = file.getPath() + File.separator + fileName; File savefile = new File(savePath); FileCopyUtils.copy(data, savefile); dbPath = bizPath + File.separator + fileName; } else { InputStream in = new ByteArrayInputStream(data); String relativePath = bizPath + "/" + fileName; if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) { dbPath = MinioUtil.upload(in, relativePath); } else if (CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)) { dbPath = OssBootUtil.upload(in, relativePath); } else { dbPath = ObsBootUtil.upload(in, relativePath); } } } catch (Exception e) { e.printStackTrace(); } return dbPath; }

修改upload方法: 在这里插入图片描述

/** * 统一全局上传 * * @Return: java.lang.String */ public static String upload(MultipartFile file, String bizPath, String uploadType) { String url = ""; try { if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) { url = MinioUtil.upload(file, bizPath); } else if (CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)) { url = OssBootUtil.upload(file, bizPath); }else{ url = ObsBootUtil.upload(file, bizPath); } } catch (Exception exception) { exception.printStackTrace(); } return url; }

修改OssFileServiceImpl实现类的upload方法(当然你新写一个也行):

在这里插入图片描述

/** * @Description: OSS云存储实现类 * @author: jeecg-boot */ @Service("ossFileService") public class OssFileServiceImpl extends ServiceImpl implements IOssFileService { @Override public void upload(MultipartFile multipartFile) throws Exception { String fileName = multipartFile.getOriginalFilename(); fileName = CommonUtils.getFileName(fileName); OssFile ossFile = new OssFile(); ossFile.setFileName(fileName); //String url = OssBootUtil.upload(multipartFile,"upload/test"); //改成华为云的 String url = ObsBootUtil.upload(multipartFile,"upload/test"); //update-begin--Author:scott Date:20201227 for:JT-361【文件预览】阿里云原生域名可以文件预览,自己映射域名kkfileview提示文件下载失败------------------- // 返回阿里云原生域名前缀URL //ossFile.setUrl(OssBootUtil.getOriginalUrl(url)); // 返回华为云原生域名前缀URL ossFile.setUrl(ObsBootUtil.getOriginalUrl(url)); //update-end--Author:scott Date:20201227 for:JT-361【文件预览】阿里云原生域名可以文件预览,自己映射域名kkfileview提示文件下载失败------------------- this.save(ossFile); } @Override public boolean delete(OssFile ossFile) { try { this.removeById(ossFile.getId()); //OssBootUtil.deleteUrl(ossFile.getUrl()); ObsBootUtil.deleteUrl(ossFile.getUrl()); } catch (Exception ex) { log.error(ex.getMessage(),ex); return false; } return true; } }

然后就大功告成了!!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有