Commit 623dfede7da056570bff44e9ca8d9f85a3c6a820

Authored by 谢茂盛
1 parent 6502f370

fix: 对接阿里oss图片服务

... ... @@ -41,6 +41,8 @@
41 41 <guava.version>20.0</guava.version>
42 42 <easy-captcha.version>1.6.2</easy-captcha.version>
43 43 <aliyun-java-sdk-core.version>4.0.3</aliyun-java-sdk-core.version>
  44 + <aliyun-sdk-oss.version>3.15.0</aliyun-sdk-oss.version>
  45 + <thumbnailator.version>0.4.8</thumbnailator.version>
44 46 <jjwt.version>0.10.6</jjwt.version>
45 47 </properties>
46 48  
... ... @@ -240,6 +242,21 @@
240 242 <artifactId>aliyun-java-sdk-core</artifactId>
241 243 <version>${aliyun-java-sdk-core.version}</version>
242 244 </dependency>
  245 +
  246 + <!--alioss 图片服务-->
  247 + <dependency>
  248 + <groupId>com.aliyun.oss</groupId>
  249 + <artifactId>aliyun-sdk-oss</artifactId>
  250 + <version>${aliyun-sdk-oss.version}</version>
  251 + </dependency>
  252 +
  253 + <!--thumbnailator 图片压缩工具-->
  254 + <dependency>
  255 + <groupId>net.coobird</groupId>
  256 + <artifactId>thumbnailator</artifactId>
  257 + <version>${thumbnailator.version}</version>
  258 + </dependency>
  259 +
243 260 </dependencies>
244 261 <build>
245 262 <finalName>order-erp.service-1.0-SNAPSHOT</finalName>
... ...
sql/table.sql
... ... @@ -12,6 +12,7 @@ CREATE TABLE `order_base_info` (
12 12 `po_color` varchar(32) DEFAULT NULL COMMENT 'PO COLOR',
13 13 `cn_color` varchar(32) DEFAULT NULL COMMENT '颜色中文',
14 14 `pic_url` varchar(128) DEFAULT NULL COMMENT 'pic图片地址',
  15 + `small_pic_url` varchar(128) DEFAULT NULL COMMENT 'pic图片地址-缩略图',
15 16 `production_comment` text DEFAULT NULL COMMENT '生产要求',
16 17 `order_count` int DEFAULT NULL COMMENT '数量',
17 18 `order_composition` varchar(128) DEFAULT NULL COMMENT '订单成分',
... ...
src/main/java/com/order/erp/common/constant/ServerResultCode.java
... ... @@ -66,6 +66,9 @@ public enum ServerResultCode implements ErrorInfo {
66 66 //申请
67 67 APPLY_UNLOCK_FIELD_EXIST(80001, "还有未审批完结的申请,请等上一个申请单完结!"),
68 68 APPLY_NOT_EXIST(80002, "申请单不存在!"),
  69 +
  70 + //上传图片
  71 + UPLOAD_IMAGES_ERROR(900021, "上传图片失败!"),
69 72 ;
70 73  
71 74  
... ...
src/main/java/com/order/erp/common/utils/AliOssUtil.java 0 → 100644
  1 +package com.order.erp.common.utils;
  2 +
  3 +import com.aliyun.oss.OSS;
  4 +import com.aliyun.oss.OSSClientBuilder;
  5 +import com.aliyun.oss.model.Bucket;
  6 +import com.aliyun.oss.model.CreateBucketRequest;
  7 +import com.aliyun.oss.model.PutObjectRequest;
  8 +import com.aliyun.oss.model.PutObjectResult;
  9 +
  10 +import java.io.ByteArrayInputStream;
  11 +import java.util.Date;
  12 +import java.util.Objects;
  13 +import java.util.Random;
  14 +
  15 +/**
  16 + * @author: xms
  17 + * @description: 阿里oss图片存储工具类
  18 + * @date: 2023/10/30 18:24
  19 + * @version: 1.0
  20 + */
  21 +public class AliOssUtil {
  22 +
  23 +
  24 +
  25 + /**
  26 + * oss 地址
  27 + */
  28 + private static final String endpoint = "https://oss-cn-qingdao.aliyuncs.com";
  29 +
  30 + /**
  31 + * 进入阿里oss获取产品key值
  32 + */
  33 + private static final String accessKeyId = "LTAIZCPI7OaWud0m";
  34 +
  35 + /**
  36 + * key值对应密码
  37 + */
  38 + private static final String accessKeySecret = "nvtGeScBwRztGeoj8WSp5OWalalgpK";
  39 +
  40 + /**
  41 + * 存储上传文件的容器
  42 + */
  43 + public static final String BUCKET = "order-erp";
  44 +
  45 + /**
  46 + * oss 客户端
  47 + */
  48 + private static OSS client;
  49 +
  50 + static {
  51 + client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  52 + }
  53 +
  54 + /**
  55 + * 实现文件名的重命名和限长
  56 + *
  57 + * @param fileName
  58 + * @return
  59 + */
  60 + public static String getUniqueFileName(String fileName) {
  61 + if (fileName.length() > 50) {
  62 + fileName = fileName.substring(fileName.length() - 50);
  63 + }
  64 + return System.currentTimeMillis() + "-" + new Random().nextInt(10000) + fileName;
  65 + }
  66 +
  67 + /**
  68 + * 创建储存空间名称
  69 + *
  70 + * @param bucketName 创建存储空间名称
  71 + * @return
  72 + */
  73 + public static boolean create(String bucketName) {
  74 + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
  75 +
  76 + Bucket bucket = client.createBucket(createBucketRequest);
  77 + return Objects.nonNull(bucket);
  78 + }
  79 +
  80 + /**
  81 + * 实现文件上传
  82 + *
  83 + * @param bucket 存储空间名称
  84 + * @param obj 存储对象名称,带文件后缀
  85 + * @param data 文件内容
  86 + * @return
  87 + */
  88 + public static boolean upload(String bucket, String obj, byte[] data) {
  89 + PutObjectRequest request = new PutObjectRequest(bucket, obj, new ByteArrayInputStream(data));
  90 + request.setProcess("true");
  91 + PutObjectResult result = client.putObject(request);
  92 + return result.getResponse().getStatusCode() == 200;
  93 + }
  94 +
  95 + /**
  96 + * 创建访问链接
  97 + *
  98 + * @param bucket 存储空间名称
  99 + * @param obj 存储对象名称,带文件名后缀
  100 + * @param etime 访问地址的失效时间
  101 + * @return 访问地址
  102 + */
  103 + public static String createUrl(String bucket, String obj, Date etime) {
  104 + return client.generatePresignedUrl(bucket, obj, etime).toString();
  105 + }
  106 +
  107 + /**
  108 + * 删除文件
  109 + *
  110 + * @param bucket 存储空间名称
  111 + * @param obj 存储对象名称,带文件后缀
  112 + */
  113 + public static void deFile(String bucket, String obj) {
  114 + client.deleteObject(bucket, obj);
  115 + }
  116 +
  117 +}
0 118 \ No newline at end of file
... ...
src/main/java/com/order/erp/controller/LocalStorageController.java
... ... @@ -31,4 +31,11 @@ public class LocalStorageController {
31 31 return localStorageService.create(name, file);
32 32 }
33 33  
  34 + @ApiOperation("上传文件到oss服务")
  35 + @PostMapping(value = "/upload_oss")
  36 + @AnonymousAccess
  37 + public ServerResult upload2oss(@RequestParam String name, @RequestParam("file") MultipartFile file) {
  38 + return localStorageService.uploadByAliOss(name, file);
  39 + }
  40 +
34 41 }
35 42 \ No newline at end of file
... ...
src/main/java/com/order/erp/domain/dto/order/OrderBaseInfoDO.java
... ... @@ -69,6 +69,10 @@ public class OrderBaseInfoDO extends BaseDO implements Serializable {
69 69 */
70 70 private String picUrl;
71 71 /**
  72 + * 缩略图地址
  73 + */
  74 + private String smallPicUrl;
  75 + /**
72 76 * 生产要求
73 77 */
74 78 private String productionComment;
... ...
src/main/java/com/order/erp/domain/vo/ImageRespVO.java 0 → 100644
  1 +package com.order.erp.domain.vo;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.io.Serializable;
  7 +
  8 +/**
  9 + * 图片上传实体类
  10 + *
  11 + * @author xms
  12 + * @since 2023-10-08 14:52:27
  13 + */
  14 +@Data
  15 +@AllArgsConstructor
  16 +@ToString
  17 +@NoArgsConstructor
  18 +@EqualsAndHashCode(callSuper = false)
  19 +@SuperBuilder
  20 +public class ImageRespVO implements Serializable {
  21 +
  22 + /**
  23 + * pic图片地址
  24 + */
  25 + private String picUrl;
  26 + /**
  27 + * 缩略图地址
  28 + */
  29 + private String smallPicUrl;
  30 +}
... ...
src/main/java/com/order/erp/domain/vo/order/OrderBaseInfoVO.java
... ... @@ -65,6 +65,11 @@ public class OrderBaseInfoVO implements Serializable {
65 65 * pic图片地址
66 66 */
67 67 private String picUrl;
  68 +
  69 + /**
  70 + * 缩略图片地址
  71 + */
  72 + private String smallPicUrl;
68 73 /**
69 74 * 生产要求
70 75 */
... ...
src/main/java/com/order/erp/service/LocalStorageService.java
... ... @@ -15,6 +15,14 @@ import org.springframework.web.multipart.MultipartFile;
15 15 */
16 16 public interface LocalStorageService extends IService<LocalStorageDO> {
17 17  
  18 + /**
  19 + * 通过阿里oss上传
  20 + *
  21 + * @param name
  22 + * @param file
  23 + * @return
  24 + */
  25 + ServerResult uploadByAliOss(String name, MultipartFile file);
18 26  
19 27 ServerResult create(String name, MultipartFile file);
20 28  
... ...
src/main/java/com/order/erp/service/impl/LocalStorageServiceImpl.java
... ... @@ -7,15 +7,20 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
7 7 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
8 8 import com.order.erp.common.constant.Constant;
9 9 import com.order.erp.common.constant.ServerResult;
  10 +import com.order.erp.common.constant.ServerResultCode;
10 11 import com.order.erp.common.exception.BusinessException;
  12 +import com.order.erp.common.utils.AliOssUtil;
11 13 import com.order.erp.common.utils.FileUtil;
12 14 import com.order.erp.common.utils.StringUtils;
13 15 import com.order.erp.domain.dto.LocalStorageDO;
  16 +import com.order.erp.domain.vo.ImageRespVO;
14 17 import com.order.erp.domain.vo.LocalStorageQueryVO;
15 18 import com.order.erp.domain.vo.LocalStorageVO;
16 19 import com.order.erp.mapper.LocalStorageMapper;
17 20 import com.order.erp.service.LocalStorageService;
18 21 import lombok.extern.slf4j.Slf4j;
  22 +import net.coobird.thumbnailator.Thumbnails;
  23 +import org.joda.time.DateTime;
19 24 import org.springframework.beans.factory.annotation.Value;
20 25 import org.springframework.stereotype.Service;
21 26 import org.springframework.web.multipart.MultipartFile;
... ... @@ -45,6 +50,32 @@ public class LocalStorageServiceImpl extends ServiceImpl&lt;LocalStorageMapper, Loc
45 50 private long maxSize;
46 51  
47 52 @Override
  53 + public ServerResult uploadByAliOss(String name, MultipartFile file) {
  54 + FileUtil.checkSize(maxSize, file.getSize());
  55 + String fileName = AliOssUtil.getUniqueFileName(name);
  56 + String tempFileName = "Thumbnails" + Constant.CROSS_BAR_CHARACTER + fileName;
  57 + ImageRespVO imageRespVO = new ImageRespVO();
  58 + try {
  59 + File tempFile = new File(path + "images" + File.separator + tempFileName);
  60 + if (AliOssUtil.upload(AliOssUtil.BUCKET, fileName, file.getBytes())) {
  61 + String originImageUrl = AliOssUtil.createUrl(AliOssUtil.BUCKET, fileName, new DateTime().plusYears(Constant.ENABLE_TEN).toDate());
  62 + imageRespVO.setPicUrl(originImageUrl);
  63 + // 生成缩略图
  64 + Thumbnails.of(file.getInputStream()).size(100, 100).toFile(tempFile);
  65 + if (AliOssUtil.upload(AliOssUtil.BUCKET, tempFileName, FileUtil.readBytes(tempFile))) {
  66 + String thumbnailImageUrl = AliOssUtil.createUrl(AliOssUtil.BUCKET, tempFileName, new DateTime().plusYears(Constant.ENABLE_TEN).toDate());
  67 + imageRespVO.setSmallPicUrl(thumbnailImageUrl);
  68 + }
  69 + FileUtil.del(tempFile);
  70 + }
  71 + return ServerResult.success(imageRespVO);
  72 + } catch (Exception e) {
  73 + log.error("上传图片异常:{}", e.getMessage());
  74 + throw new BusinessException(ServerResultCode.UPLOAD_IMAGES_ERROR);
  75 + }
  76 + }
  77 +
  78 + @Override
48 79 public ServerResult create(String name, MultipartFile multipartFile) {
49 80 FileUtil.checkSize(maxSize, multipartFile.getSize());
50 81 String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename());
... ...