Selaa lähdekoodia

图片上传整体修改为阿里云oss

ssk 2 viikkoa sitten
vanhempi
commit
d799ce88b3

+ 2 - 1
alien-gateway/src/main/resources/bootstrap.yml

@@ -17,4 +17,5 @@ spring:
         username: nacos
         password: ngfriend198092
         group: DEFAULT_GROUP
-        file-extension: yml
+        file-extension: yml
+#        namespace: 3cbb802a-b56e-47f7-b658-b5012ecafb1f

+ 19 - 8
alien-store/src/main/java/shop/alien/store/controller/AliController.java

@@ -1,20 +1,18 @@
 package shop.alien.store.controller;
 
 import com.alibaba.fastjson.JSONObject;
-import com.alipay.api.AlipayApiException;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 import shop.alien.entity.result.R;
 import shop.alien.store.service.AliService;
-import shop.alien.util.common.AlipayTradeAppPay;
-import shop.alien.util.common.AlipayTradeRefund;
 import shop.alien.store.util.ali.AliApi;
 import shop.alien.store.util.ali.AliSms;
+import shop.alien.util.ali.AliOSSUtil;
+import shop.alien.util.common.AlipayTradeAppPay;
+import shop.alien.util.common.AlipayTradeRefund;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -43,6 +41,8 @@ public class AliController {
 
     private final AlipayTradeRefund alipayTradeRefund;
 
+    private final AliOSSUtil aliOSSUtil;
+
     @ApiOperation("阿里回调")
     @ApiOperationSupport(order = 1)
     @GetMapping("/notify")
@@ -182,8 +182,19 @@ public class AliController {
     }
 
     @GetMapping("/returnPay")
-    public void returnPay(String orderNo, String refundAmount) throws AlipayApiException {
+    public void returnPay(String orderNo, String refundAmount) {
         alipayTradeRefund.processRefund(orderNo, refundAmount, "退款");
     }
 
+    @ApiOperation("跳转支付宝人脸核身查询记录")
+    @ApiOperationSupport(order = 11)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "文件", dataType = "File", paramType = "query", required = true),
+            @ApiImplicitParam(name = "ossFilePath", value = "oss中的文件路径", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/uploadFile")
+    public R<String> uploadFile(@RequestParam(value = "file") MultipartFile multipartFile, @RequestParam(value = "ossFilePath") String ossFilePath) {
+        return R.data(aliOSSUtil.uploadFile(multipartFile, ossFilePath));
+    }
+
 }

+ 3 - 3
alien-store/src/main/java/shop/alien/store/controller/LifeGroupPackageController.java

@@ -118,7 +118,7 @@ public class LifeGroupPackageController {
             @RequestParam("status") String status,
             @RequestParam("couponCode") String couponCode,
             @RequestParam("name") String name) {
-        log.info("LifeGroupPackageController.getGroupPackageList?pageNum={},pageSize={},storeId={},status={}", storeId, status, page, size);
+        log.info("LifeGroupPackageController.getGroupPackageList?pageNum={}&pageSize={}&storeId={}&status={}", page, size, storeId, status);
         return R.data(lifeGroupPackageService.getGroupPackageList(page, size, storeId, status, couponCode, name));
     }
 
@@ -157,14 +157,14 @@ public class LifeGroupPackageController {
     @GetMapping("/getGroupPackageDetail")
     private R<Map<String, Object>> getGroupPackageDetail(@RequestParam("id") String id, @RequestParam("userId") String userId) {
         log.info("LifeGroupPackageController.getGroupPackageDetail?id={}&userId={}", id, userId);
-        return R.data(lifeGroupPackageService.getGroupPackageDetail(id,userId));
+        return R.data(lifeGroupPackageService.getGroupPackageDetail(id, userId));
     }
 
     @ApiOperation("酒店团购详情")
     @GetMapping("/getGroupHotelPackageDetail")
     private R<Map<String, Object>> getGroupHotelPackageDetail(@RequestParam("id") String id, @RequestParam("userId") String userId) {
         log.info("LifeGroupPackageController.getGroupHotelPackageDetail?id={}&userId={}", id, userId);
-        return R.data(lifeGroupPackageService.getGroupHotelPackageDetail(id,userId));
+        return R.data(lifeGroupPackageService.getGroupHotelPackageDetail(id, userId));
     }
 
     @ApiOperation("猜你喜欢")

+ 6 - 6
alien-store/src/main/java/shop/alien/store/controller/StoreFileUploadController.java

@@ -32,7 +32,7 @@ public class StoreFileUploadController {
 
     private final FileUploadUtil fileUpload;
 
-    @ApiOperation("单个文件上传")
+    @ApiOperation("单个文件上传(图片或视频,返回路径)")
     @ApiOperationSupport(order = 1)
     @PostMapping("/upload")
     public R<String> upload(@RequestParam("file") MultipartFile file) {
@@ -40,7 +40,7 @@ public class StoreFileUploadController {
         return R.data(fileUpload.uploadOneFile(file));
     }
 
-    @ApiOperation("多个文件上传")
+    @ApiOperation("多个文件上传(图片或视频,视频会截取第一秒图片,返回路径)")
     @ApiOperationSupport(order = 2)
     @PostMapping("/uploadMore")
     public R<List<String>> uploadMore(MultipartRequest multipartRequest) {
@@ -48,19 +48,19 @@ public class StoreFileUploadController {
         return R.data(fileUpload.uploadMoreFile(multipartRequest));
     }
 
-    @ApiOperation("图片上传, 返回图片id")
+    @ApiOperation(value = "图片上传(其实也可以传视频,不会截图), 返回图片id", notes = "文件格式: file_0,file_1, list格式: [{\"storeId\":1,\"imgType\":3,\"imgDescription\":\"菜品1\",\"imgSort\":1},{\"storeId\":1,\"imgType\":3,\"imgDescription\":\"菜品2\",\"imgSort\":2}]")
     @ApiOperationSupport(order = 3)
     @PostMapping("/uploadImg")
     public R<List<Integer>> uploadImg(MultipartRequest multipartRequest, @RequestParam("list") String list) {
         return R.data(fileUpload.uploadImg(multipartRequest, list));
     }
 
-    @ApiOperation("上传app")
+    @ApiOperation("上传app(格式包含apk,ipa,wgt,返回路径)")
     @ApiOperationSupport(order = 4)
     @PostMapping("/uploadApp")
-    public R<Boolean> uploadApp(@RequestParam("file") MultipartFile file) {
+    public R<String> uploadApp(@RequestParam("file") MultipartFile file) {
         log.info("StoreFileUploadController.uploadApp fileName:{}", file.getOriginalFilename());
-        return fileUpload.uploadApp(file);
+        return R.data(fileUpload.uploadApp(file));
     }
 
 }

+ 61 - 44
alien-store/src/main/java/shop/alien/store/util/FileUploadUtil.java

@@ -10,8 +10,10 @@ import org.springframework.web.multipart.MultipartRequest;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.vo.StoreImgVo;
 import shop.alien.store.service.StoreImgService;
+import shop.alien.util.ali.AliOSSUtil;
 import shop.alien.util.common.RandomCreateUtil;
 import shop.alien.util.common.VideoUtils;
+import shop.alien.util.file.FileUtil;
 
 import java.io.File;
 import java.nio.file.Files;
@@ -34,11 +36,7 @@ public class FileUploadUtil {
     @Value("${spring.web.resources.static-locations}")
     private String uploadDir;
 
-    @Value("${spring.web.resources.app-locations}")
-    private String uploadAppDir;
-
-    @Value("${spring.web.resources.url}")
-    private String fileUrl;
+    private final AliOSSUtil aliOSSUtil;
 
     List<String> imageFileType = Arrays.asList("jpg", "jpeg", "png", "bmp", "webp", "gif", "svg");
     List<String> videoFileType = Arrays.asList("mp4", "avi", "flv", "mkv", "rmvb", "wmv", "3gp", "mov");
@@ -47,22 +45,19 @@ public class FileUploadUtil {
     /**
      * 上传文件
      *
-     * @param file 文件名
+     * @param multipartFile 文件名
      * @return 文件路径
      */
-    public String uploadOneFile(MultipartFile file) {
+    public String uploadOneFile(MultipartFile multipartFile) {
         try {
-            String cleanUploadDir = uploadDir.replace("\\", "/");
+            Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
             String prefix = "";
-            String type = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1);
-            if (imageFileType.contains(type.toLowerCase())) {
-                cleanUploadDir += "/image";
+            if (imageFileType.contains(fileNameAndType.get("type").toLowerCase())) {
                 prefix = "image/";
-            } else if (videoFileType.contains(type.toLowerCase())) {
-                cleanUploadDir += "/video";
+            } else if (videoFileType.contains(fileNameAndType.get("type").toLowerCase())) {
                 prefix = "video/";
             }
-            return copyFile(cleanUploadDir, prefix, file);
+            return aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type"));
         } catch (Exception e) {
             log.error("FileUpload.uploadOneFile ERROR Msg={}", e.getMessage());
             throw new RuntimeException(e);
@@ -72,21 +67,21 @@ public class FileUploadUtil {
     /**
      * 上传app文件
      *
-     * @param file 文件名
+     * @param multipartFile 文件名
      * @return 文件路径
      */
-    public R<Boolean> uploadApp(MultipartFile file) {
+    public String uploadApp(MultipartFile multipartFile) {
         try {
-            String type = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf('.') + 1);
-            if (!appFileType.contains(type)) {
-                return R.fail("该文件不是app格式文件");
+            Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
+            if (!appFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                log.error("FileUpload.uploadApp ERROR 该文件不是app格式文件");
+                return null;
             }
-            String cleanUploadDir = uploadAppDir.replace("\\", "/");
             String prefix = "app/";
-            return R.success(copyFile(cleanUploadDir, prefix, file));
+            return aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type"));
         } catch (Exception e) {
             log.error("FileUpload.uploadApp ERROR Msg={}", e.getMessage());
-            throw new RuntimeException(e);
+            return null;
         }
     }
 
@@ -106,28 +101,32 @@ public class FileUploadUtil {
                 log.info("FileUpload.uploadMoreFile fileName={}", multipartFile.getOriginalFilename());
                 String uploadDir = this.uploadDir.replace("file:///", "").replace("\\", "/");
                 String prefix;
-                String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.') + 1);
+                Map<String, String> fileNameAndType = FileUtil.getFileNameAndType(multipartFile);
                 //区分文件类型
-                if (imageFileType.contains(type.toLowerCase())) {
+                if (imageFileType.contains(fileNameAndType.get("type").toLowerCase())) {
                     uploadDir += "/image";
                     prefix = "image/";
                     log.info("FileUpload.uploadMoreFile 获取到图片文件准备复制 {} {} {}", uploadDir, prefix, multipartFile.getOriginalFilename());
-                    filePathList.add(copyFile(uploadDir, prefix, multipartFile));
-                } else if (videoFileType.contains(type.toLowerCase())) {
-                    uploadDir += "/video";
+                    filePathList.add(aliOSSUtil.uploadFile(multipartFile, prefix + fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6) + "." + fileNameAndType.get("type")));
+                    ;
+                } else if (videoFileType.contains(fileNameAndType.get("type").toLowerCase())) {
+                    uploadDir += "/video/";
                     prefix = "video/";
+                    //上传视频文件
                     log.info("FileUpload.uploadMoreFile 获取到视频文件准备复制 {} {} {}", uploadDir, prefix, multipartFile.getOriginalFilename());
-                    String localFileName = copyFile(uploadDir, prefix, multipartFile);
-                    filePathList.add(localFileName);
+                    String videoFileName = fileNameAndType.get("name") + RandomCreateUtil.getRandomNum(6);
+                    String cacheVideoPath = copyFile(uploadDir, multipartFile);
+                    filePathList.add(aliOSSUtil.uploadFile(multipartFile, prefix + videoFileName + "." + fileNameAndType.get("type")));
+                    //缓存视频截图使用
+                    File videoFile = new File(cacheVideoPath);
                     //获取视频某帧截图
-                    log.info("FileUpload.uploadMoreFile 视频文件复制完毕, 获取第一秒图片 {}", localFileName);
-                    String videoPath = videoUtils.getImg(uploadDir + "/" + new File(localFileName).getName());
+                    log.info("FileUpload.uploadMoreFile 视频文件复制完毕, 获取第一秒图片 {}", videoFile.getName());
+                    String videoPath = videoUtils.getImg(uploadDir + "/" + videoFile.getName());
                     log.info("FileUpload.uploadMoreFile 视频文件复制完毕, 图片位置 {}", videoPath);
                     if (!videoPath.isEmpty()) {
                         File videoImgFile = new File(videoPath);
-                        String videoImgFileUrl = fileUrl + prefix + videoImgFile.getName();
-                        log.info("FileUpload.uploadMoreFile 视频图片获取完毕 {}", videoImgFileUrl);
-                        filePathList.add(videoImgFileUrl);
+                        Map<String, String> videoImg = FileUtil.getFileNameAndType(videoImgFile);
+                        filePathList.add(aliOSSUtil.uploadFile(videoImgFile, prefix + videoFileName + "." + videoImg.get("type")));
                     } else {
                         throw new RuntimeException("视频截图失败");
                     }
@@ -165,18 +164,16 @@ public class FileUploadUtil {
         for (StoreImgVo storeImgVo : storeImgList) {
             //获取文件
             MultipartFile multipartFile = multipartRequest.getFileMap().get(storeImgVo.getName());
-            String uploadDir = this.uploadDir.replace("file:///", "").replace("\\", "/");
+            Map<String, String> fileInfo = FileUtil.getFileNameAndType(multipartFile);
+            String videoFileName = fileInfo.get("name") + RandomCreateUtil.getRandomNum(6);
             String prefix;
-            String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.') + 1);
             String filePath = "";
-            if (imageFileType.contains(type.toLowerCase())) {
-                uploadDir += "/image";
+            if (imageFileType.contains(fileInfo.get("type").toLowerCase())) {
                 prefix = "image/";
-                filePath = copyFile(uploadDir, prefix, multipartFile);
-            } else if (videoFileType.contains(type.toLowerCase())) {
-                uploadDir += "/video";
+                filePath = aliOSSUtil.uploadFile(multipartFile, prefix + videoFileName + "." + fileInfo.get("type"));
+            } else if (videoFileType.contains(fileInfo.get("type").toLowerCase())) {
                 prefix = "video/";
-                filePath = copyFile(uploadDir, prefix, multipartFile);
+                filePath = aliOSSUtil.uploadFile(multipartFile, prefix + videoFileName + "." + fileInfo.get("type"));
             }
             storeImgVo.setImgUrl(filePath);
             storeImgService.save(storeImgVo);
@@ -189,10 +186,30 @@ public class FileUploadUtil {
      * 复制文件, 返回url链接
      *
      * @param localFilePath 本地路径
-     * @param urlPath       拼接的url路劲
      * @param file          文件
      * @return 访问url路径
      */
+    private String copyFile(String localFilePath, MultipartFile file) {
+        try {
+            File cacheFilePath = new File(localFilePath);
+            if (!cacheFilePath.exists()) {
+                cacheFilePath.mkdirs();
+            }
+            String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.'));
+            log.info("FileUpload.copyFile fileName={}", fileName);
+            String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
+            log.info("FileUpload.copyFile fileType={}", fileType);
+            System.out.println(file.getOriginalFilename());
+            Path path = Paths.get(localFilePath, file.getOriginalFilename());
+            Files.createDirectories(path.getParent());
+            Files.write(path, file.getBytes());
+            return localFilePath + file.getOriginalFilename();
+        } catch (Exception e) {
+            log.error("FileUpload.copyFile ERROR Msg={}", e.getMessage());
+            return e.getMessage();
+        }
+    }
+
     private String copyFile(String localFilePath, String urlPath, MultipartFile file) {
         try {
             String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.'));
@@ -206,7 +223,7 @@ public class FileUploadUtil {
             Path path = Paths.get(localFilePath, newFileName);
             Files.createDirectories(path.getParent());
             Files.write(path, file.getBytes());
-            return fileUrl + urlPath + newFileName;
+            return urlPath + newFileName;
         } catch (Exception e) {
             log.error("FileUpload.copyFile ERROR Msg={}", e.getMessage());
             return e.getMessage();

+ 2 - 1
alien-store/src/main/resources/bootstrap.yml

@@ -17,4 +17,5 @@ spring:
         username: nacos
         password: ngfriend198092
         group: DEFAULT_GROUP
-        file-extension: yml
+        file-extension: yml
+#        namespace: 3cbb802a-b56e-47f7-b658-b5012ecafb1f

+ 6 - 0
alien-util/pom.xml

@@ -317,6 +317,12 @@
             <version>0.9.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.17.4</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 88 - 0
alien-util/src/main/java/shop/alien/util/ali/AliOSSUtil.java

@@ -0,0 +1,88 @@
+package shop.alien.util.ali;
+
+import com.aliyun.oss.ClientBuilderConfiguration;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.comm.SignVersion;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import shop.alien.util.file.FileUtil;
+
+import java.io.File;
+
+/**
+ * 阿里云oss工具类
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/7/17 8:51
+ */
+@Slf4j
+@Component
+public class AliOSSUtil {
+
+    @Value("${ali.oss.accessKeyId}")
+    private String accessKeyId;
+
+    @Value("${ali.oss.accessKeySecret}")
+    private String accessKeySecret;
+
+    @Value("${ali.oss.endPoint}")
+    private String endPoint;
+
+    @Value("${ali.oss.bucketName}")
+    private String bucketName;
+
+    /**
+     * oss上传文件
+     *
+     * @param multipartFile 前端上传的文件
+     * @param ossFilePath   oss中文件全路径(image/xxx.jpg)
+     * @return filePath
+     */
+    public String uploadFile(MultipartFile multipartFile, String ossFilePath) {
+        File convertFile = FileUtil.convert(multipartFile);
+        return uploadFile(convertFile, ossFilePath);
+    }
+
+    /**
+     * oss上传文件
+     *
+     * @param file        后端文件
+     * @param ossFilePath oss中文件全路径(image/xxx.jpg)
+     * @return filePath
+     */
+    public String uploadFile(File file, String ossFilePath) {
+        // 创建OSSClient实例。
+        // 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
+        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
+        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
+        OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
+        try {
+            // 创建PutObjectRequest对象。
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossFilePath, file);
+            // 上传文件
+            PutObjectResult result = ossClient.putObject(putObjectRequest);
+            String eTag = result.getETag();
+            if (StringUtils.isNotEmpty(eTag)) {
+                //删除临时文件
+                file.delete();
+                return "https://" + bucketName + "." + endPoint + "/" + ossFilePath;
+            }
+            return null;
+        } catch (Exception e) {
+            log.error("AliOSSUtil.uploadFile ERROR: {}", e.getMessage());
+            return null;
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+    }
+
+}

+ 81 - 0
alien-util/src/main/java/shop/alien/util/ali/Demo.java

@@ -0,0 +1,81 @@
+package shop.alien.util.ali;
+
+import com.aliyun.oss.*;
+import com.aliyun.oss.common.auth.CredentialsProviderFactory;
+import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
+import com.aliyun.oss.common.comm.SignVersion;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+
+import java.io.File;
+
+public class Demo {
+
+    public static void main(String[] args) throws Exception {
+
+        String accessKeyId = "LTAI5tG6wSYrSgN3Cwek17Du"; // 你的AccessKey ID
+        String accessKeySecret = "PQDPdTtDy0v848p0Bl9vT5yHmpt79H"; // 你的AccessKey Secret
+
+        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
+        String endpoint = "oss-cn-beijing.aliyuncs.com";
+        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
+        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
+        // 填写Bucket名称,例如examplebucket。
+        String bucketName = "alien-volume";
+        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
+        String objectName = "image/微信图片_2025-07-15_104613_218.jpg";
+        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
+        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
+        String filePath = "C:\\Users\\17238\\Pictures\\微信图片_2025-07-15_104613_218.jpg";
+        // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
+        String region = "cn-beijing";
+
+        // 创建OSSClient实例。
+        // 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
+        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
+        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
+//        OSS ossClient = OSSClientBuilder.create()
+//                .endpoint(endpoint)
+//                .credentialsProvider(credentialsProvider)
+//                .clientConfiguration(clientBuilderConfiguration)
+//                .region(region)
+//                .build();
+
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+
+        try {
+            // 创建PutObjectRequest对象。
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
+            // 默认使用Bucket的ACL设置(推荐生产环境使用Private)
+//            ObjectMetadata metadata = new ObjectMetadata();
+//             metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
+//             metadata.setObjectAcl(CannedAccessControlList.PublicRead);
+//             putObjectRequest.setMetadata(metadata);
+
+            // 上传文件。
+            PutObjectResult result = ossClient.putObject(putObjectRequest);
+            String fileUrl = "https://" + bucketName + "." + endpoint + "/" + objectName;
+            System.out.println("文件访问地址: " + fileUrl);
+        } catch (OSSException oe) {
+            System.out.println("Caught an OSSException, which means your request made it to OSS, "
+                    + "but was rejected with an error response for some reason.");
+            System.out.println("Error Message:" + oe.getErrorMessage());
+            System.out.println("Error Code:" + oe.getErrorCode());
+            System.out.println("Request ID:" + oe.getRequestId());
+            System.out.println("Host ID:" + oe.getHostId());
+        } catch (ClientException ce) {
+            System.out.println("Caught an ClientException, which means the client encountered "
+                    + "a serious internal problem while trying to communicate with OSS, "
+                    + "such as not being able to access the network.");
+            System.out.println("Error Message:" + ce.getMessage());
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+
+
+    }
+
+
+}

+ 17 - 22
alien-util/src/main/java/shop/alien/util/common/safe/ImageModerationUtil.java

@@ -1,21 +1,12 @@
 package shop.alien.util.common.safe;
+
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.aliyun.green20220302.Client;
-import com.aliyun.green20220302.models.ImageBatchModerationResponse;
-import com.aliyun.green20220302.models.ImageModerationRequest;
-import com.aliyun.green20220302.models.ImageModerationResponse;
-import com.aliyun.green20220302.models.ImageBatchModerationRequest;
-import com.aliyun.green20220302.models.ImageBatchModerationResponse;
-import com.aliyun.green20220302.models.ImageBatchModerationResponseBody;
-import com.aliyun.green20220302.models.ImageModerationResponseBody;
-import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyData;
-import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyDataResult;
-
+import com.aliyun.green20220302.models.*;
 import com.aliyun.teaopenapi.models.Config;
 import com.aliyun.teautil.models.RuntimeOptions;
 import com.google.common.collect.Lists;
-import jdk.nashorn.internal.runtime.logging.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
@@ -25,7 +16,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-@Logger
+@Slf4j
 @Component
 public class ImageModerationUtil {
 
@@ -40,7 +31,8 @@ public class ImageModerationUtil {
 
     /**
      * 创建请求客户端
-     * @return  Client
+     *
+     * @return Client
      * @throws Exception 创建客户端异常
      */
     public Client createClient() throws Exception {
@@ -63,12 +55,12 @@ public class ImageModerationUtil {
     /**
      * 提供给service调用的方法
      *
-     * @param imageUrl 图片地址
+     * @param imageUrl    图片地址
      * @param serviceEnum Service类型
      * @return 检测结果
      * @throws Exception 检测异常
      */
-    public ImageModerationResponse invokeFunction(String imageUrl,String serviceEnum) throws Exception {
+    public ImageModerationResponse invokeFunction(String imageUrl, String serviceEnum) throws Exception {
         //注意,此处实例化的client请尽可能重复使用,避免重复建立连接,提升检测性能。
         Client client = createClient();
 
@@ -100,12 +92,12 @@ public class ImageModerationUtil {
     /**
      * 批量图片检测
      *
-     * @param imageUrl 图片地址
+     * @param imageUrl    图片地址
      * @param serviceEnum Service类型 服务名逗号拼接
      * @return 检测结果
      * @throws Exception 检测异常
      */
-    public ImageBatchModerationResponse invokeBeachFunction(String imageUrl,String serviceEnum) throws Exception {
+    public ImageBatchModerationResponse invokeBeachFunction(String imageUrl, String serviceEnum) throws Exception {
         Client client = createClient();
         RuntimeOptions runtime = new RuntimeOptions();
         Map<String, String> serviceParameters = new HashMap<>();
@@ -122,6 +114,7 @@ public class ImageModerationUtil {
         }
         return response;
     }
+
     /**
      * 发布商品场景检测
      * 顺序调用内容治理检测、AIGC图片风险检测、图片万物识别
@@ -139,10 +132,10 @@ public class ImageModerationUtil {
         // TODO 后续配置到数据库 中
         servicesList.add(ImageReviewServiceEnum.TONALITY_IMPROVE.getService());
         servicesList.add(ImageReviewServiceEnum.AIGC_CHECK.getService());
-        for (String service : servicesList){
-            if (isSpecialService(service)){
+        for (String service : servicesList) {
+            if (isSpecialService(service)) {
                 serviceBatchEnum.append(service).append(",");
-            }else {
+            } else {
                 serviceEnum.append(service).append(",");
             }
         }
@@ -176,7 +169,7 @@ public class ImageModerationUtil {
                     if ("high".equals(riskLevel)) {
                         for (ImageBatchModerationResponseBody.ImageBatchModerationResponseBodyDataResult result : results) {
                             // 触发多个,如果置信分高于80 则拼接描述
-                            if (result.getConfidence() > 80 ) {
+                            if (result.getConfidence() > 80) {
                                 String label = result.getLabel();
                                 String description = result.getDescription();
                                 // 拼接标签
@@ -229,6 +222,7 @@ public class ImageModerationUtil {
 
     /**
      * 调用DeepSeek接口生成商品文案
+     *
      * @param prompt 提示信息
      * @return 生成的文案
      * @throws IOException 调用异常
@@ -240,6 +234,7 @@ public class ImageModerationUtil {
 
     /**
      * 判断服务是否为特殊服务,若是可以调取阿里多service审核服务,返回多个场景的总审核结果
+     *
      * @param service 服务名称
      * @return 是否为特殊服务
      */

+ 52 - 0
alien-util/src/main/java/shop/alien/util/file/FileUtil.java

@@ -2,6 +2,7 @@ package shop.alien.util.file;
 
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -459,4 +460,55 @@ public class FileUtil {
         return filePath.replace("\\", "/");
     }
 
+
+    /**
+     * 文件转换
+     *
+     * @param multipartFile 前端上传的文件
+     * @return File
+     */
+    public static File convert(MultipartFile multipartFile) {
+        try {
+            // 创建一个临时文件
+            File tempFile = File.createTempFile("upload-", ".tmp");
+            // 将MultipartFile内容转存到临时文件中
+            multipartFile.transferTo(tempFile);
+            return tempFile;
+        } catch (IOException e) {
+            log.error("FileUtil.convert ERROR: {}", e.getMessage());
+            return null;
+        }
+    }
+
+    /**
+     * 获取文件名称和类型
+     *
+     * @param multipartFile
+     * @return
+     */
+    public static Map<String, String> getFileNameAndType(MultipartFile multipartFile) {
+        String originalFilename = multipartFile.getOriginalFilename();
+        Map<String, String> map = new HashMap<>();
+        String fileName = originalFilename.substring(0, originalFilename.lastIndexOf('.'));
+        String fileType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
+        map.put("name", fileName);
+        map.put("type", fileType);
+        return map;
+    }
+
+    /**
+     * 获取文件名称和类型
+     *
+     * @param file
+     * @return
+     */
+    public static Map<String, String> getFileNameAndType(File file) {
+        String originalFilename = file.getName();
+        Map<String, String> map = new HashMap<>();
+        String fileName = originalFilename.substring(0, originalFilename.lastIndexOf('.'));
+        String fileType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
+        map.put("name", fileName);
+        map.put("type", fileType);
+        return map;
+    }
 }