Просмотр исходного кода

file添加打包方式,优化上传保存路径获取

lengfaqiang 2 лет назад
Родитель
Сommit
e99ef12a4d

+ 6 - 6
README.md

@@ -26,8 +26,8 @@
 | *服务网关       | 采用 SpringCloud Gateway 框架扩展了多种功能例如:内网鉴权、请求体缓存、跨域配置、请求响应日志等                                             |
 | *负载均衡       | 采用 SpringCloud Loadbalancer 扩展支持了开发团队路由 便于多团队开发调试                                                      |
 | *RPC远程调用    | 采用 全新 Apache Dubbo 3.X + OpenFeign                                                                     |
-| 分布式限流熔断     | 采用 Alibaba Sentinel 源码集成便于调试扩展与二次开发 框架还为其增加了各种监控                                                       |
-| 分布式事务       | 采用 Alibaba Seata 源码集成对接了Nacos与各种监控 简化了搭建部署流程                                                           |                                                                        |
+| *分布式限流熔断    | 采用 Alibaba Sentinel 源码集成便于调试扩展与二次开发 框架还为其增加了各种监控                                                       |
+| *分布式事务      | 采用 Alibaba Seata 源码集成对接了Nacos与各种监控 简化了搭建部署流程                                                           |                                                                        |
 | 权限认证        | 采用 Sa-Token、Jwt 静态使用功能齐全 低耦合 高扩展                                                                       |
 | 权限注解        | 采用 Sa-Token 支持注解 登录校验、角色校验、权限校验、二级认证校验、HttpBasic校验、忽略校验角色与权限校验支持多种条件 如 `AND` `OR` 或 `权限 OR 角色` 等复杂表达式  |
 | *关系数据库      | 使用 MySQL                                                                                               |                                    
@@ -43,8 +43,8 @@
 | 数据库连接池      | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下/Druid                                                       |
 | *数据库主键      | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁                                                       |
 | 服务端与前端消息通信  | 援用现有mqtt                                                                                               |
-| *序列化         | 采用 Jackson Spring官方内置序列化 靠谱!!!                                                                         |
-| 分布式任务调度     | 采用 Xxl-Job 天生支持分布式 统一的管理中心                                                                             |
+| *序列化        | 采用 Jackson Spring官方内置序列化 靠谱!!!                                                                         |
+| *分布式任务调度    | 采用 Xxl-Job 天生支持分布式 统一的管理中心                                                                             |
 | 分布式日志中心     | 采用 ELK 业界成熟解决方案 实时收集所有服务的运行日志 快速发现定位问题                                                                 |
 | 分布式搜索引擎     | 采用 ElasticSearch以 Mybatis-Plus 方式操作 ElasticSearch                                                      |
 | *分布式消息队列    | 采用 SpringCloud-Stream + RabbitMQ                                                                       |
@@ -53,8 +53,8 @@
 | 短链接         | 购买现成产品                                                                                                 |
 | 接口文档        | 沿用现有接口文档系统                                                                                             |
 | 校验框架        | 采用 Validation 支持注解与工具类校验 注解支持国际化                                                                       |
-| *Excel框架     | 采用 Alibaba EasyExcel 基于插件化框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等                                         |
-| *工具类框架       | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码                                            |
+| *Excel框架    | 采用 Alibaba EasyExcel 基于插件化框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等                                         |
+| *工具类框架      | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码                                            |
 | 服务监控框架      | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制实时监控服务状态 框架还为其扩展了在线日志查看监控                              |
 | 全方位监控报警     | 采用 Prometheus、Grafana 多样化采集 多模板大屏展示 实时报警监控 提供详细的搭建文档                                                   |
 | 链路追踪        | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗用了它即可实时查看请求经过的每一处每一个节点                                      |

+ 16 - 0
sckw-modules/sckw-file/pom.xml

@@ -111,4 +111,20 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>

+ 33 - 19
sckw-modules/sckw-file/src/main/java/com/sckw/file/utils/FileUtils.java

@@ -7,7 +7,6 @@ import com.sckw.core.utils.IdWorker;
 import com.sckw.core.utils.PasswordUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.excel.common.NumberConstant;
-import com.sckw.excel.common.StringConstant;
 import com.sckw.file.common.enums.AliyunOssFileTypeEnum;
 import com.sckw.file.common.enums.FileEnum;
 import jakarta.annotation.PostConstruct;
@@ -92,6 +91,7 @@ public class FileUtils {
 
     /**
      * 获取指定文件或文件夹的后缀名
+     *
      * @param fileName 文件名称
      * @return
      */
@@ -109,10 +109,10 @@ public class FileUtils {
      */
     public static Map<String, String> uploadFileByInfo(MultipartFile file, FileEnum fileEnum) {
         Map<String, String> infoMap = new HashMap<>();
+        //创建OSSClient实例
+        defalutOSS();
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         try {
-            //创建OSSClient实例
-            defalutOSS();
-            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
             //容器不存在,就创建
             if (!ossClient.doesBucketExist(bucketName)) {
                 ossClient.createBucket(bucketName);
@@ -134,7 +134,7 @@ public class FileUtils {
             //2021/02/02/01.jpg
             String timeUrl = new DateTime().toString("yyyyMMdd");
             fileName = timeUrl + "/" + fileName;
-            String filePath = BASE_DIR + fileName+fileSuffix;
+            String filePath = BASE_DIR + fileName + fileSuffix;
             //调用方法实现上传
             ossClient.putObject(bucketName, filePath, inputStream);
             //上传后的文件地址
@@ -144,14 +144,19 @@ public class FileUtils {
             //上传之后文件路径
             //https://yygh-atguigu.oss-cn-beijing.aliyuncs.com/01.jpg
 //            String url = "https://" + bucketName + "." + endpoint + "/" + filePath;
-            String url = StringConstant.HTTPS_STRING+StringConstant.COLON+StringConstant.LEFT_SEPARATORS + bucketName + StringConstant.POINT + endpoint + StringConstant.LEFT_SEPARATOR+ filePath;
+            //绝对路径 "https://kaiwu-saas.oss-cn-chengdu.aliyuncs.com/+ filePath;"
+//            String url = StringConstant.HTTPS_STRING+StringConstant.COLON+StringConstant.LEFT_SEPARATORS + bucketName + StringConstant.POINT + endpoint + StringConstant.LEFT_SEPARATOR+ filePath;
+            //相对路径
+            String url = filePath;
             //返回 上传文件地址
             infoMap.put("filePath", url);
         } catch (IOException e) {
             infoMap.put("filePath", null);
+            //关闭OSSClient。
+            ossClient.shutdown();
             e.printStackTrace();
             log.error("oss-upload-file-error:{}", e.getMessage(), e);
-           throw new RuntimeException("oss-upload-file-error:"+e.getMessage());
+            throw new RuntimeException("oss-upload-file-error:" + e.getMessage());
         }
         return infoMap;
     }
@@ -166,6 +171,9 @@ public class FileUtils {
      * @return
      */
     public static String uploadFile(MultipartFile file, FileEnum fileEnum) {
+        // 私有云要关闭CNAME
+        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
+        conf.setSupportCname(false);
         try {
             //创建OSSClient实例
             defalutOSS();
@@ -190,8 +198,11 @@ public class FileUtils {
             String timeUrl = new DateTime().toString("yyyyMMdd");
             fileName = timeUrl + "/" + fileName;
             String filePath = BASE_DIR + fileName;
+            /**设置上传内容类型*/
+            ObjectMetadata objectMeta = new ObjectMetadata();
+            objectMeta.setContentType(FileUtils.getContentTypeByOSS(file.getOriginalFilename()));
             //调用方法实现上传
-            ossClient.putObject(bucketName, filePath, inputStream);
+            ossClient.putObject(bucketName, filePath, inputStream,objectMeta);
             //上传后的文件地址
 //            String url1 = getUrl(ossClient, bucketName, filePath);
 //            System.out.println(url1);
@@ -361,19 +372,19 @@ public class FileUtils {
      *
      * @param response response
      * @param fileName 文件名字,带后缀,例子:postman.txt
-     *                 文件全路径 https://kaiwu-saas.oss-cn-chengdu.aliyuncs.com/kll/uploads/20230605/146325493677821952598454132.txt
+     *                 文件全路径 kll/uploads/20230605/146325493677821952598454132.txt 去除“https://kaiwu-saas.oss-cn-chengdu.aliyuncs.com/”
      */
     public static void downloadByFileName(HttpServletResponse response, String fileName) {
         defalutOSS();
         OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         OSSObject ossObject = ossClient.getObject(bucketName, fileName);
         boolean exist = ossClient.doesObjectExist(bucketName, fileName);
-        if (!exist){
+        if (!exist) {
             throw new RuntimeException("下载文件不存在!");
         }
         String contentType = ossObject.getObjectMetadata().getContentType();
         String contentType1 = getContentType(fileName);
-        System.out.println("contentType:" + contentType);
+//        System.out.println("contentType:" + contentType);
 //        System.out.println("contentType1:" + contentType1);
         //设置响应内容类型,当设置了ContentType为“image/jpg”时,浏览器可以直接显示图片;
         response.setContentType(contentType);
@@ -575,7 +586,7 @@ public class FileUtils {
      */
     public static String getUrl(OSS ossClient, String bucketName, String key) {
         //设置URl过期时间为99年:3600L*1000*24*365*99
-        Date expiration = new Date( System.currentTimeMillis()+ 3600L * 1000 * 24 * 365 * 99);
+        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 99);
         GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
         generatePresignedUrlRequest.setExpiration(expiration);
         URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
@@ -605,7 +616,7 @@ public class FileUtils {
             BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
             while (true) {
                 String line = reader.readLine();
-                if (line == null){
+                if (line == null) {
                     break;
                 }
 
@@ -671,6 +682,7 @@ public class FileUtils {
 
     /**
      * 通过oss的完整key下载
+     *
      * @param response response
      * @param url      全路径的url地址 kll/uploads/20230621/07ccbec381a011d121a215719199ac49.html
      */
@@ -679,13 +691,13 @@ public class FileUtils {
     }
 
     /**
-     * @Title:downloadToFile
-     * @Description: 下载文件到本地
      * @param @param ossFilePath oss上的文件路径(全路径)
      * @param @param newFilePath 本地文件路径 (全路径)
      * @return void    返回类型
+     * @Title:downloadToFile
+     * @Description: 下载文件到本地
      */
-    public static void downloadToFile(String endPoint, String accessKeyId, String accessKeySecret, String bucketName, String ossFilePath, String newFilePath){
+    public static void downloadToFile(String endPoint, String accessKeyId, String accessKeySecret, String bucketName, String ossFilePath, String newFilePath) {
         //实例化OSSClient对象
         OSSClient ossClient = (OSSClient) new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
         try {
@@ -859,6 +871,7 @@ public class FileUtils {
 
     /**
      * 删除文件
+     *
      * @param url 示例:'download/file.xsl' oss服务器文件路径以及文件名
      */
     public static void remove(String url) {
@@ -885,17 +898,18 @@ public class FileUtils {
 
     /**
      * 获取OSS连接
+     *
      * @return
      */
     private static void getOSSClient() {
-        if (ossclient == null){
+        if (ossclient == null) {
             ossclient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         }
     }
 
     /**
      * 根据key删除OSS服务器上的文件
-     *
+     * <p>
      * param ossClient oss连接
      * param bucketName 存储空间
      * param folder 模拟文件夹名 如"qj_nanjing/"
@@ -956,7 +970,7 @@ public class FileUtils {
      * 下载文件,此处主要是给Controller层提供一个OSS的Object类
      * objectName示例:download/file.xsl,()这里是oss文件列表中 文件路径和文件名
      */
-    public static OSSObject downloadOssFile(OutputStream os, String objectName)  {
+    public static OSSObject downloadOssFile(OutputStream os, String objectName) {
         // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
         OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
         OSSObject ossObject = ossClient.getObject(bucketName, objectName);