Commit 623dfede7da056570bff44e9ca8d9f85a3c6a820
1 parent
6502f370
fix: 对接阿里oss图片服务
Showing
10 changed files
with
223 additions
and
0 deletions
pom.xml
... | ... | @@ -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
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
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
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<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()); | ... | ... |