Commit 623dfede7da056570bff44e9ca8d9f85a3c6a820
1 parent
6502f370
fix: 对接阿里oss图片服务
Showing
10 changed files
with
223 additions
and
0 deletions
pom.xml
@@ -41,6 +41,8 @@ | @@ -41,6 +41,8 @@ | ||
41 | <guava.version>20.0</guava.version> | 41 | <guava.version>20.0</guava.version> |
42 | <easy-captcha.version>1.6.2</easy-captcha.version> | 42 | <easy-captcha.version>1.6.2</easy-captcha.version> |
43 | <aliyun-java-sdk-core.version>4.0.3</aliyun-java-sdk-core.version> | 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 | <jjwt.version>0.10.6</jjwt.version> | 46 | <jjwt.version>0.10.6</jjwt.version> |
45 | </properties> | 47 | </properties> |
46 | 48 | ||
@@ -240,6 +242,21 @@ | @@ -240,6 +242,21 @@ | ||
240 | <artifactId>aliyun-java-sdk-core</artifactId> | 242 | <artifactId>aliyun-java-sdk-core</artifactId> |
241 | <version>${aliyun-java-sdk-core.version}</version> | 243 | <version>${aliyun-java-sdk-core.version}</version> |
242 | </dependency> | 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 | </dependencies> | 260 | </dependencies> |
244 | <build> | 261 | <build> |
245 | <finalName>order-erp.service-1.0-SNAPSHOT</finalName> | 262 | <finalName>order-erp.service-1.0-SNAPSHOT</finalName> |
sql/table.sql
@@ -12,6 +12,7 @@ CREATE TABLE `order_base_info` ( | @@ -12,6 +12,7 @@ CREATE TABLE `order_base_info` ( | ||
12 | `po_color` varchar(32) DEFAULT NULL COMMENT 'PO COLOR', | 12 | `po_color` varchar(32) DEFAULT NULL COMMENT 'PO COLOR', |
13 | `cn_color` varchar(32) DEFAULT NULL COMMENT '颜色中文', | 13 | `cn_color` varchar(32) DEFAULT NULL COMMENT '颜色中文', |
14 | `pic_url` varchar(128) DEFAULT NULL COMMENT 'pic图片地址', | 14 | `pic_url` varchar(128) DEFAULT NULL COMMENT 'pic图片地址', |
15 | + `small_pic_url` varchar(128) DEFAULT NULL COMMENT 'pic图片地址-缩略图', | ||
15 | `production_comment` text DEFAULT NULL COMMENT '生产要求', | 16 | `production_comment` text DEFAULT NULL COMMENT '生产要求', |
16 | `order_count` int DEFAULT NULL COMMENT '数量', | 17 | `order_count` int DEFAULT NULL COMMENT '数量', |
17 | `order_composition` varchar(128) DEFAULT NULL COMMENT '订单成分', | 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,6 +66,9 @@ public enum ServerResultCode implements ErrorInfo { | ||
66 | //申请 | 66 | //申请 |
67 | APPLY_UNLOCK_FIELD_EXIST(80001, "还有未审批完结的申请,请等上一个申请单完结!"), | 67 | APPLY_UNLOCK_FIELD_EXIST(80001, "还有未审批完结的申请,请等上一个申请单完结!"), |
68 | APPLY_NOT_EXIST(80002, "申请单不存在!"), | 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 | \ No newline at end of file | 118 | \ No newline at end of file |
src/main/java/com/order/erp/controller/LocalStorageController.java
@@ -31,4 +31,11 @@ public class LocalStorageController { | @@ -31,4 +31,11 @@ public class LocalStorageController { | ||
31 | return localStorageService.create(name, file); | 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 | \ No newline at end of file | 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,6 +69,10 @@ public class OrderBaseInfoDO extends BaseDO implements Serializable { | ||
69 | */ | 69 | */ |
70 | private String picUrl; | 70 | private String picUrl; |
71 | /** | 71 | /** |
72 | + * 缩略图地址 | ||
73 | + */ | ||
74 | + private String smallPicUrl; | ||
75 | + /** | ||
72 | * 生产要求 | 76 | * 生产要求 |
73 | */ | 77 | */ |
74 | private String productionComment; | 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,6 +65,11 @@ public class OrderBaseInfoVO implements Serializable { | ||
65 | * pic图片地址 | 65 | * pic图片地址 |
66 | */ | 66 | */ |
67 | private String picUrl; | 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,6 +15,14 @@ import org.springframework.web.multipart.MultipartFile; | ||
15 | */ | 15 | */ |
16 | public interface LocalStorageService extends IService<LocalStorageDO> { | 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 | ServerResult create(String name, MultipartFile file); | 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,15 +7,20 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||
7 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 7 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
8 | import com.order.erp.common.constant.Constant; | 8 | import com.order.erp.common.constant.Constant; |
9 | import com.order.erp.common.constant.ServerResult; | 9 | import com.order.erp.common.constant.ServerResult; |
10 | +import com.order.erp.common.constant.ServerResultCode; | ||
10 | import com.order.erp.common.exception.BusinessException; | 11 | import com.order.erp.common.exception.BusinessException; |
12 | +import com.order.erp.common.utils.AliOssUtil; | ||
11 | import com.order.erp.common.utils.FileUtil; | 13 | import com.order.erp.common.utils.FileUtil; |
12 | import com.order.erp.common.utils.StringUtils; | 14 | import com.order.erp.common.utils.StringUtils; |
13 | import com.order.erp.domain.dto.LocalStorageDO; | 15 | import com.order.erp.domain.dto.LocalStorageDO; |
16 | +import com.order.erp.domain.vo.ImageRespVO; | ||
14 | import com.order.erp.domain.vo.LocalStorageQueryVO; | 17 | import com.order.erp.domain.vo.LocalStorageQueryVO; |
15 | import com.order.erp.domain.vo.LocalStorageVO; | 18 | import com.order.erp.domain.vo.LocalStorageVO; |
16 | import com.order.erp.mapper.LocalStorageMapper; | 19 | import com.order.erp.mapper.LocalStorageMapper; |
17 | import com.order.erp.service.LocalStorageService; | 20 | import com.order.erp.service.LocalStorageService; |
18 | import lombok.extern.slf4j.Slf4j; | 21 | import lombok.extern.slf4j.Slf4j; |
22 | +import net.coobird.thumbnailator.Thumbnails; | ||
23 | +import org.joda.time.DateTime; | ||
19 | import org.springframework.beans.factory.annotation.Value; | 24 | import org.springframework.beans.factory.annotation.Value; |
20 | import org.springframework.stereotype.Service; | 25 | import org.springframework.stereotype.Service; |
21 | import org.springframework.web.multipart.MultipartFile; | 26 | import org.springframework.web.multipart.MultipartFile; |
@@ -45,6 +50,32 @@ public class LocalStorageServiceImpl extends ServiceImpl<LocalStorageMapper, Loc | @@ -45,6 +50,32 @@ public class LocalStorageServiceImpl extends ServiceImpl<LocalStorageMapper, Loc | ||
45 | private long maxSize; | 50 | private long maxSize; |
46 | 51 | ||
47 | @Override | 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 | public ServerResult create(String name, MultipartFile multipartFile) { | 79 | public ServerResult create(String name, MultipartFile multipartFile) { |
49 | FileUtil.checkSize(maxSize, multipartFile.getSize()); | 80 | FileUtil.checkSize(maxSize, multipartFile.getSize()); |
50 | String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename()); | 81 | String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename()); |