ggbocoder пре 2 година
родитељ
комит
788e2b2882

+ 19 - 0
pom.xml

@@ -135,6 +135,25 @@
         </dependency>
 
 
+        <!--简化bean代码-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+
+        <!-- 图片上传 SDK 阿里云oss -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>2.8.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 46 - 0
src/main/java/cn/seecoder/fdroidrepository/Controller/OssController.java

@@ -0,0 +1,46 @@
+package cn.seecoder.fdroidrepository.Controller;
+
+import cn.seecoder.fdroidrepository.result.SingleResult;
+import cn.seecoder.fdroidrepository.utils.AliyunOssUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+import java.io.FileOutputStream;
+
+
+@RestController
+@RequestMapping("/api/oss")
+public class OssController {
+    @Autowired
+    private AliyunOssUtil ossUtil;
+
+    @PostMapping("/uploadFile")
+    public SingleResult<String> upload(@RequestParam("file") MultipartFile file) {
+        try {
+            if (file != null) {
+                String fileName = file.getOriginalFilename();
+                if (!"".equals(fileName.trim())) {
+                    File newFile = new File(fileName);
+
+                    FileOutputStream os = new FileOutputStream(newFile);
+                    os.write(file.getBytes());
+                    os.close();
+                    //把file里的内容复制到newFile中
+                    file.transferTo(newFile);
+                    String upload = ossUtil.upload(newFile);
+                    //图片回显地址:
+                    http://fdroid-app-icon.oss-cn-beijing.aliyuncs.com/app_icons/2023-12-15/e71f985bf6e94cb3a4e7ffe6ac46e909-x.jpg
+                    System.out.println("path=" + upload);
+                    return SingleResult.success( upload);
+                }
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return SingleResult.failure("500","upload failed!");
+    }
+}

+ 4 - 4
src/main/java/cn/seecoder/fdroidrepository/Controller/UserController.java

@@ -3,7 +3,7 @@ package cn.seecoder.fdroidrepository.Controller;
 
 
 import cn.seecoder.fdroidrepository.DataObject.User;
-import cn.seecoder.fdroidrepository.Service.ServiceImpl.USER_STATUS;
+import cn.seecoder.fdroidrepository.DataObject.Enum.UserStatusEnum;
 import cn.seecoder.fdroidrepository.Service.IUserService;
 import cn.seecoder.fdroidrepository.config.WebSecurityConfig;
 import cn.seecoder.fdroidrepository.result.Code;
@@ -44,10 +44,10 @@ public class UserController {
 
     @GetMapping("/activation/{userId}/{code}")
     private Result<?> activate(@PathVariable int userId,@PathVariable String code){
-        USER_STATUS result= IUserService.activate(userId,code);
-        if(result==USER_STATUS.START_ACTIVATE){
+        UserStatusEnum result= IUserService.activate(userId,code);
+        if(result== UserStatusEnum.START_ACTIVATE){
             return new Result<>("200","activate success");
-        }else if(result==USER_STATUS.REPEAT_ACTIVATE){
+        }else if(result== UserStatusEnum.REPEAT_ACTIVATE){
             return new Result<>("409","repeat activation");
         }
         return new Result<>("400","activate failed!");

+ 7 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/UserStatusEnum.java

@@ -0,0 +1,7 @@
+package cn.seecoder.fdroidrepository.DataObject.Enum;
+
+public enum UserStatusEnum {
+    REPEAT_ACTIVATE,
+    START_ACTIVATE,
+    FAIL_ACTIVATE
+}

+ 2 - 2
src/main/java/cn/seecoder/fdroidrepository/Service/IUserService.java

@@ -1,7 +1,7 @@
 package cn.seecoder.fdroidrepository.Service;
 
 import cn.seecoder.fdroidrepository.DataObject.User;
-import cn.seecoder.fdroidrepository.Service.ServiceImpl.USER_STATUS;
+import cn.seecoder.fdroidrepository.DataObject.Enum.UserStatusEnum;
 
 
 public interface IUserService {
@@ -9,7 +9,7 @@ public interface IUserService {
 
     void save(User user);
 
-    USER_STATUS activate(int userId, String code);
+    UserStatusEnum activate(int userId, String code);
 
     boolean isUsernameUnique(String username);
 }

+ 0 - 7
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/USER_STATUS.java

@@ -1,7 +0,0 @@
-package cn.seecoder.fdroidrepository.Service.ServiceImpl;
-
-public enum USER_STATUS {
-    REPEAT_ACTIVATE,
-    START_ACTIVATE,
-    FAIL_ACTIVATE
-}

+ 5 - 4
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/UserService.java

@@ -1,6 +1,7 @@
 package cn.seecoder.fdroidrepository.Service.ServiceImpl;
 
 
+import cn.seecoder.fdroidrepository.DataObject.Enum.UserStatusEnum;
 import cn.seecoder.fdroidrepository.DataObject.User;
 import cn.seecoder.fdroidrepository.Mapper.UserMapper;
 import cn.seecoder.fdroidrepository.Service.IUserService;
@@ -48,14 +49,14 @@ public class UserService implements IUserService, UserDetailsService {
     }
 
     @Override
-    public USER_STATUS activate(int userId, String code) {
+    public UserStatusEnum activate(int userId, String code) {
         User user=userMapper.selectByUserId(userId);
         if(user.isActive()){
-            return USER_STATUS.REPEAT_ACTIVATE;
+            return UserStatusEnum.REPEAT_ACTIVATE;
         }else if(user.getActivationCode().equals(code)){
-            return USER_STATUS.START_ACTIVATE;
+            return UserStatusEnum.START_ACTIVATE;
         }else{
-            return USER_STATUS.FAIL_ACTIVATE;
+            return UserStatusEnum.FAIL_ACTIVATE;
         }
     }
 

+ 24 - 0
src/main/java/cn/seecoder/fdroidrepository/config/OssConfig.java

@@ -0,0 +1,24 @@
+package cn.seecoder.fdroidrepository.config;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+
+@Data
+@Configuration
+public class OssConfig {
+    @Value("${aliyun.oss.endpoint}")
+    private String endPoint;
+    @Value("${aliyun.oss.accessKeyId}")
+    private String accessKeyId;
+    @Value("${aliyun.oss.accessKeySecret}")
+    private String accessKeySecret;
+    @Value("${aliyun.oss.filehost}")
+    private String fileHost;
+    @Value("${aliyun.oss.bucketName}")
+    private String bucketName;
+}

+ 4 - 3
src/main/java/cn/seecoder/fdroidrepository/config/WebMvcConfig.java

@@ -4,6 +4,7 @@ package cn.seecoder.fdroidrepository.config;
 import cn.seecoder.fdroidrepository.interceptor.DataInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -15,9 +16,9 @@ public class WebMvcConfig implements WebMvcConfigurer {
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(dataInterceptor)
-            .excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg");
+//        registry.addInterceptor(dataInterceptor)
+//            .excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg")
+//            .order(Ordered.LOWEST_PRECEDENCE);;
     }
 
-
 }

+ 117 - 0
src/main/java/cn/seecoder/fdroidrepository/utils/AliyunOssUtil.java

@@ -0,0 +1,117 @@
+package cn.seecoder.fdroidrepository.utils;
+
+import cn.seecoder.fdroidrepository.config.OssConfig;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+@Component
+public class AliyunOssUtil {
+
+    private Logger logger= LoggerFactory.getLogger(AliyunOssUtil.class);
+    @Autowired
+    private OssConfig config;
+
+
+    public String upload(File file) {
+        if (file == null) {
+            return null;
+        }
+        String endPoint = config.getEndPoint();
+        String keyId = config.getAccessKeyId();
+        String keySecret = config.getAccessKeySecret();
+        String bucketName = config.getBucketName();
+        String fileHost = config.getFileHost();
+
+        //定义子文件的格式
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String dateStr = format.format(new Date());
+        //阿里云文件上传客户端
+        OSSClient client = new OSSClient(endPoint, keyId, keySecret);
+        try {
+            //判断桶是否存在
+            if (!client.doesBucketExist(bucketName)) {
+                //创建桶
+                client.createBucket(bucketName);
+                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
+                //设置访问权限为公共读
+                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
+                //发起创建桶的请求
+                client.createBucket(createBucketRequest);
+            }
+            //当桶存在时,进行文件上传
+            //设置文件路径和名称
+            String fileUrl = fileHost + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setContentType(getcontentType(file.getName().substring(file.getName().lastIndexOf("."))));
+            objectMetadata.setContentDisposition("inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
+            PutObjectResult result = client.putObject(new PutObjectRequest(bucketName, fileUrl, file,objectMetadata));
+            client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
+            //文件上传成功后,返回当前文件的路径
+            if (result != null) {
+                return "http://" + bucketName + "." + endPoint.substring(7) + "/" + fileUrl;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (client != null) {
+                client.shutdown();
+            }
+        }
+        return null;
+    }
+
+
+    public static String getcontentType(String FilenameExtension) {
+        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
+            return "image/bmp";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".gif")) {
+            return "image/gif";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
+            FilenameExtension.equalsIgnoreCase(".jpg") ||
+            FilenameExtension.equalsIgnoreCase(".png")) {
+            return "image/jpg";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".html")) {
+            return "text/html";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".txt")) {
+            return "text/plain";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
+            return "application/vnd.visio";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
+            FilenameExtension.equalsIgnoreCase(".ppt")) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".docx") ||
+            FilenameExtension.equalsIgnoreCase(".doc")) {
+            return "application/msword";
+        }
+        if (FilenameExtension.equalsIgnoreCase(".xml")) {
+            return "text/xml";
+        }
+        return "image/jpg";
+    }
+
+
+
+
+}

+ 8 - 0
src/main/resources/application.properties

@@ -75,3 +75,11 @@ spring.kafka.consumer.group-id=fdroid-consumer-group
 spring.kafka.consumer.enable-auto-commit=true
 spring.kafka.consumer.auto-commit-interval=3000
 
+
+## 阿里云oss服务
+aliyun.oss.bucketName=fdroid-app-icon
+aliyun.oss.accessKeyId=LTAI5tQSVZYftkDRsi9bzoys
+aliyun.oss.accessKeySecret=Hs0CgR6D0DfwbcJPSQsuToXEwrDUvF
+#OSS对应的区域
+aliyun.oss.endpoint=http://oss-cn-beijing.aliyuncs.com
+aliyun.oss.filehost=app_icons