Procházet zdrojové kódy

1.资源转换进度80%。视频格式转换、文档格式转换

jasonk5949 před 8 měsíci
rodič
revize
37bd52eb72
55 změnil soubory, kde provedl 1104 přidání a 158 odebrání
  1. 92 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/pom.xml
  2. 4 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/AsyncTaskComp.java
  3. 6 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/FileDealComp.java
  4. 3 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CommonFileController.java
  5. 2 9
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FileController.java
  6. 5 19
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FiletransferController.java
  7. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/NoticeController.java
  8. 3 15
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/OfficeController.java
  9. 1 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/RecoveryFileController.java
  10. 5 7
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/ShareController.java
  11. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/SysParamController.java
  12. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TaskController.java
  13. 37 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TranscodingController.java
  14. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/UserController.java
  15. 3 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/user/UserBean.java
  16. 31 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/file/TranscodingReqDTO.java
  17. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/provider/NetDiskApiProvider.java
  18. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ICommonFileService.java
  19. 0 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IElasticSearchService.java
  20. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFilePermissionService.java
  21. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFileService.java
  22. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFiletransferService.java
  23. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/INoticeService.java
  24. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IOperationLogService.java
  25. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IRecoveryFileService.java
  26. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareFileService.java
  27. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareService.java
  28. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IStorageService.java
  29. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ISysParamService.java
  30. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskDetailService.java
  31. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskService.java
  32. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserFileService.java
  33. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserLoginInfoService.java
  34. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserService.java
  35. 15 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/TranscodingService.java
  36. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CommonFileService.java
  37. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FilePermissionService.java
  38. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FileService.java
  39. 3 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FiletransferService.java
  40. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/NoticeService.java
  41. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/OperationLogService.java
  42. 2 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/RecoveryFileService.java
  43. 2 10
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareFileService.java
  44. 2 6
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareService.java
  45. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/StorageService.java
  46. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/SysParamService.java
  47. 106 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/TranscodingServiceImpl.java
  48. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskDetailService.java
  49. 2 8
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskService.java
  50. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserFileService.java
  51. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserLoginInfoService.java
  52. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserService.java
  53. 155 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/OfficeConverter.java
  54. 251 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/PdfUtils.java
  55. 329 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/VideoConverter.java

+ 92 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/pom.xml

@@ -14,9 +14,21 @@
     <version>2.0.0</version>
     <packaging>jar</packaging>
     <description>业务功能插件func实现</description>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
     <name>qiwen-file</name>
     <properties>
-        <java.version>1.8</java.version>
+<!--        <java.version>1.8</java.version>-->
         <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
         <skipTests>true</skipTests>
         <docker.image.prefix>scp</docker.image.prefix>
@@ -37,7 +49,7 @@
         <commons-io.version>2.11.0</commons-io.version>
         <jjwt.version>0.9.1</jjwt.version>
         <thumbnailator.version>0.4.16</thumbnailator.version>
-        <fastjson2.version>2.0.5.graal</fastjson2.version>
+        <fastjson2.version>2.0.34</fastjson2.version>
         <swagger-annotations.version>2.1.4</swagger-annotations.version>
         <mybatis-plus.version>3.5.2</mybatis-plus.version>
         <poi-version>5.2.2</poi-version>
@@ -46,7 +58,7 @@
         <javacpp.version>1.5.7</javacpp.version>
         <javacv.version>1.5.7</javacv.version>
         <ffmpeg.version>5.0-1.5.7</ffmpeg.version>
-        <minio.version>8.3.4</minio.version>
+        <minio.version>8.5.7</minio.version>
         <qiniu.version>7.9.2</qiniu.version>
         <hutool.version>5.8.16</hutool.version>
         <springdoc-openapi.version>1.6.1</springdoc-openapi.version>
@@ -56,10 +68,17 @@
         <jpinyin.version>1.1.8</jpinyin.version>
         <jaudiotagger.version>2.0.1</jaudiotagger.version>
         <htmlunit.version>2.62.0</htmlunit.version>
+        <poi.version>5.2.3</poi.version>
     </properties>
 
-
     <dependencies>
+
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.4.0</version>
+        </dependency>
+
         <!-- 每个插件都要引入自己的对外接口 -->
         <dependency>
             <groupId>vip.xiaonuo</groupId>
@@ -123,7 +142,6 @@
             <scope>runtime</scope>
         </dependency>
 
-
         <!--jpa-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -200,5 +218,74 @@
             <scope>runtime</scope>
         </dependency>
 
+        <!-- Apache POI -->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.poi</groupId>-->
+<!--            <artifactId>poi</artifactId>-->
+<!--            <version>5.2.3</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.poi</groupId>-->
+<!--            <artifactId>poi-ooxml</artifactId>-->
+<!--            <version>5.2.3</version>-->
+<!--        </dependency>-->
+
+        <!-- Apache POI核心依赖 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+        <!-- Apache Commons IO -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.13.0</version>
+        </dependency>
+
+
     </dependencies>
+
+    <repositories>
+        <repository>
+            <id>jcenter</id>
+            <url>https://jcenter.bintray.com/</url>
+        </repository>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases><enabled>true</enabled></releases>
+            <snapshots><enabled>false</enabled></snapshots>
+        </repository>
+        <repository>
+            <id>central</id>
+            <url>https://repo.maven.apache.org/maven2</url>
+            <releases><enabled>true</enabled></releases>
+            <snapshots><enabled>false</enabled></snapshots>
+        </repository>
+        <repository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots</url>
+            <releases><enabled>false</enabled></releases>
+            <snapshots><enabled>true</enabled></snapshots>
+        </repository>
+    </repositories>
+
+
 </project>

+ 4 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/AsyncTaskComp.java

@@ -17,8 +17,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.AsyncResult;
 import org.springframework.stereotype.Component;
-import vip.xiaonuo.disk.api.IFiletransferService;
-import vip.xiaonuo.disk.api.IRecoveryFileService;
+import vip.xiaonuo.disk.service.IFiletransferService;
+import vip.xiaonuo.disk.service.IRecoveryFileService;
 import vip.xiaonuo.disk.domain.UserFile;
 
 import javax.annotation.Resource;
@@ -79,7 +79,7 @@ public class AsyncTaskComp {
                             filetransferService.deleteFile(fileBean);
                             fileMapper.deleteById(fileBean.getFileId());
                         } catch (Exception e) {
-                            log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
+//                            log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
                         }
                     }
 
@@ -97,7 +97,7 @@ public class AsyncTaskComp {
                     filetransferService.deleteFile(fileBean);
                     fileMapper.deleteById(fileBean.getFileId());
                 } catch (Exception e) {
-                    log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
+//                    log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
                 }
             }
         }

+ 6 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/FileDealComp.java

@@ -3,15 +3,16 @@ package vip.xiaonuo.disk.component;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
-import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.MusicUtils;
 import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IShareFileService;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IShareFileService;
+import vip.xiaonuo.disk.service.IShareService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.config.es.FileSearch;
 import vip.xiaonuo.disk.domain.*;
 import vip.xiaonuo.disk.io.QiwenFile;
@@ -348,7 +349,7 @@ public class FileDealComp {
 
 //                String userId = userService.getUserIdByToken(token);
                 String userId = StpLoginUserUtil.getLoginUser().getId();
-                log.debug(JSON.toJSONString("当前登录session用户id:" + userId));
+//                log.debug(JSON.toJSONString("当前登录session用户id:" + userId));
                 if (userId == null) {
                     return false;
                 }

+ 3 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CommonFileController.java

@@ -5,12 +5,10 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.ICommonFileService;
-import vip.xiaonuo.disk.api.IFilePermissionService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.ICommonFileService;
+import vip.xiaonuo.disk.service.IFilePermissionService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.domain.CommonFile;
 import vip.xiaonuo.disk.domain.FilePermission;
 import vip.xiaonuo.disk.domain.UserFile;

+ 2 - 9
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FileController.java

@@ -6,8 +6,6 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient;
 import co.elastic.clients.elasticsearch.core.SearchResponse;
 import co.elastic.clients.elasticsearch.core.search.HighlighterEncoder;
 import co.elastic.clients.elasticsearch.core.search.Hit;
-import com.alibaba.fastjson2.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -15,11 +13,10 @@ import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.exception.QiwenException;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
 import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IFileService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.IFileService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.component.AsyncTaskComp;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.config.es.FileSearch;
@@ -39,8 +36,6 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jetty.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -57,8 +52,6 @@ import java.util.*;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 @Tag(name = "file", description = "该接口为文件接口,主要用来做一些文件的基本操作,如创建目录,删除,移动,复制等。")
 @RestController

+ 5 - 19
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FiletransferController.java

@@ -1,15 +1,12 @@
 package vip.xiaonuo.disk.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.MimeUtils;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IFileService;
-import vip.xiaonuo.disk.api.IFiletransferService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.IFileService;
+import vip.xiaonuo.disk.service.IFiletransferService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.FileBean;
 import vip.xiaonuo.disk.domain.StorageBean;
@@ -19,7 +16,7 @@ import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
 import vip.xiaonuo.disk.dto.file.PreviewDTO;
 import vip.xiaonuo.disk.dto.file.UploadFileDTO;
 import vip.xiaonuo.disk.io.QiwenFile;
-import vip.xiaonuo.disk.service.StorageService;
+import vip.xiaonuo.disk.service.impl.StorageService;
 import vip.xiaonuo.disk.vo.file.UploadFileVo;
 import com.qiwenshare.ufop.factory.UFOPFactory;
 import com.qiwenshare.ufop.operation.download.Downloader;
@@ -196,19 +193,8 @@ public class FiletransferController {
             filetransferService.previewPictureFile(httpServletResponse, previewDTO);
             return ;
         }
+        // token逻辑去掉
         String token = "";
-        if (StringUtils.isNotEmpty(previewDTO.getToken())) {
-            token = previewDTO.getToken();
-        } else {
-            Cookie[] cookieArr = httpServletRequest.getCookies();
-            if (cookieArr != null) {
-                for (Cookie cookie : cookieArr) {
-                    if ("token".equals(cookie.getName())) {
-                        token = cookie.getValue();
-                    }
-                }
-            }
-        }
 
         UserFile userFile = userFileService.getById(previewDTO.getUserFileId());
         boolean authResult = fileDealComp.checkAuthDownloadAndPreview(previewDTO.getShareBatchNum(),

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/NoticeController.java

@@ -2,7 +2,7 @@ package vip.xiaonuo.disk.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qiwenshare.common.result.RestResult;
-import vip.xiaonuo.disk.api.INoticeService;
+import vip.xiaonuo.disk.service.INoticeService;
 import vip.xiaonuo.disk.domain.Notice;
 import vip.xiaonuo.disk.dto.notice.NoticeListDTO;
 import io.swagger.v3.oas.annotations.Operation;

+ 3 - 15
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/OfficeController.java

@@ -1,23 +1,17 @@
 package vip.xiaonuo.disk.controller;
 
-import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
 import com.qiwenshare.common.exception.NotLoginException;
 import com.qiwenshare.common.result.RestResult;
-import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IFileService;
-import vip.xiaonuo.disk.api.IUserFileService;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IFileService;
+import vip.xiaonuo.disk.service.IUserFileService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.FileBean;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.domain.user.UserBean;
-import vip.xiaonuo.disk.dto.file.CreateOfficeFileDTO;
 import vip.xiaonuo.disk.dto.file.EditOfficeFileDTO;
 import vip.xiaonuo.disk.dto.file.PreviewOfficeFileDTO;
 import vip.xiaonuo.disk.office.documentserver.managers.history.HistoryManager;
@@ -28,8 +22,6 @@ import vip.xiaonuo.disk.office.entities.User;
 import vip.xiaonuo.disk.office.services.configurers.FileConfigurer;
 import vip.xiaonuo.disk.office.services.configurers.wrappers.DefaultFileWrapper;
 import com.qiwenshare.ufop.factory.UFOPFactory;
-import com.qiwenshare.ufop.operation.copy.Copier;
-import com.qiwenshare.ufop.operation.copy.domain.CopyFile;
 import com.qiwenshare.ufop.operation.download.domain.DownloadFile;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -43,17 +35,13 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.net.URLDecoder;
-import java.util.List;
 import java.util.Locale;
 import java.util.Scanner;
-import java.util.UUID;
 
 @Tag(name = "office", description = "该接口为Onlyoffice文件操作接口,主要用来做一些文档的编辑,浏览等。")
 @RestController

+ 1 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/RecoveryFileController.java

@@ -1,18 +1,15 @@
 package vip.xiaonuo.disk.controller;
 
-import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.*;
 import vip.xiaonuo.disk.component.AsyncTaskComp;
 import vip.xiaonuo.disk.domain.RecoveryFile;
 import vip.xiaonuo.disk.dto.file.DeleteRecoveryFileDTO;
 import vip.xiaonuo.disk.dto.recoveryfile.BatchDeleteRecoveryFileDTO;
 import vip.xiaonuo.disk.dto.recoveryfile.RestoreFileDTO;
+import vip.xiaonuo.disk.service.*;
 import vip.xiaonuo.disk.vo.file.RecoveryFileListVo;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;

+ 5 - 7
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/ShareController.java

@@ -9,12 +9,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IShareFileService;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.IShareFileService;
+import vip.xiaonuo.disk.service.IShareService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.Share;
 import vip.xiaonuo.disk.domain.ShareFile;
@@ -150,7 +148,7 @@ public class ShareController {
                     userFile1.setUserId(userId);
                     userFile1.setFilePath(userFile1.getFilePath().replaceFirst(QiwenFile.formatPath(filePath + "/" + fileName), QiwenFile.formatPath(savefilePath + "/" + savefileName)));
                     saveUserFileList.add(userFile1);
-                    log.info("当前文件:" + JSON.toJSONString(userFile1));
+//                    log.info("当前文件:" + JSON.toJSONString(userFile1));
                 }
             }
             userFile2.setUserFileId(IdUtil.getSnowflakeNextIdStr());
@@ -160,7 +158,7 @@ public class ShareController {
             saveUserFileList.add(userFile2);
 
         }
-        log.info("----------" + JSON.toJSONString(saveUserFileList));
+//        log.info("----------" + JSON.toJSONString(saveUserFileList));
         userFileService.saveBatch(saveUserFileList);
 
         return RestResult.success();

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/SysParamController.java

@@ -3,7 +3,7 @@ package vip.xiaonuo.disk.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.result.RestResult;
-import vip.xiaonuo.disk.api.ISysParamService;
+import vip.xiaonuo.disk.service.ISysParamService;
 import vip.xiaonuo.disk.domain.SysParam;
 import vip.xiaonuo.disk.dto.param.QueryGroupParamDTO;
 import io.swagger.v3.oas.annotations.Operation;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TaskController.java

@@ -2,12 +2,12 @@ package vip.xiaonuo.disk.controller;
 
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import vip.xiaonuo.disk.api.IShareFileService;
+import vip.xiaonuo.disk.service.IShareFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.ShareFile;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.io.QiwenFile;
-import vip.xiaonuo.disk.service.UserFileService;
+import vip.xiaonuo.disk.service.impl.UserFileService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;

+ 37 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TranscodingController.java

@@ -0,0 +1,37 @@
+package vip.xiaonuo.disk.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.dto.file.TranscodingReqDTO;
+import vip.xiaonuo.disk.service.TranscodingService;
+
+import javax.annotation.Resource;
+
+/**
+ * 资源转码controller
+ *
+ * @author jinjilong
+ */
+@RestController
+@Slf4j
+@Validated
+public class TranscodingController {
+
+    @Resource
+    private TranscodingService transcodingService;
+
+
+    /**
+     * 视频资源转码
+     */
+    @PostMapping("/transcoding/file")
+    public CommonResult<String> transcodingVideo(@RequestBody TranscodingReqDTO transcodingReqDTO) {
+        return transcodingService.transcodingVideo(transcodingReqDTO);
+    }
+
+
+}

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/UserController.java

@@ -6,12 +6,10 @@ import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.HashUtils;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IUserLoginInfoService;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IUserLoginInfoService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.component.JwtComp;
 import vip.xiaonuo.disk.domain.UserLoginInfo;
 import vip.xiaonuo.disk.domain.user.UserBean;

+ 3 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/user/UserBean.java

@@ -13,9 +13,9 @@ import javax.persistence.*;
  * @author ma116
  */
 @Data
-@Table(name = "user")
-@Entity
-@TableName("user")
+//@Table(name = "user")
+//@Entity
+//@TableName("user")
 public class UserBean {
 
     @Id

+ 31 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/file/TranscodingReqDTO.java

@@ -0,0 +1,31 @@
+package vip.xiaonuo.disk.dto.file;
+
+import lombok.Data;
+
+/**
+ * 资源转码 请求参数
+ *
+ * @author jinjilong
+ */
+@Data
+public class TranscodingReqDTO {
+
+    /**
+     * 文件id
+     */
+    private String fileId;
+
+    /**
+     * 转码类型 0: 视频 1: 文档
+     */
+    private Integer transcodingType;
+
+    /**
+     * 转码格式
+     * 视频:mp4 wmv avi flv mpeg mpg rmvb mov
+     * 文档:pdf doc docx ppt pptx xls xlsx
+     */
+    private String format;
+
+
+}

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/provider/NetDiskApiProvider.java

@@ -2,7 +2,7 @@ package vip.xiaonuo.disk.provider;
 
 import org.springframework.stereotype.Service;
 import vip.xiaonuo.disk.api.NetDiskApi;
-import vip.xiaonuo.disk.service.UserService;
+import vip.xiaonuo.disk.service.impl.UserService;
 
 import javax.annotation.Resource;
 

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/ICommonFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ICommonFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.CommonFile;

+ 0 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IElasticSearchService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IElasticSearchService.java


+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IFilePermissionService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFilePermissionService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.FilePermission;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.FileBean;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IFiletransferService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFiletransferService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import vip.xiaonuo.disk.domain.FileBean;
 import vip.xiaonuo.disk.domain.UserFile;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/INoticeService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/INoticeService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IOperationLogService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IOperationLogService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IRecoveryFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IRecoveryFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.RecoveryFile;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IShareFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.Share;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IShareService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.RecoveryFile;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IStorageService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IStorageService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.StorageBean;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/ISysParamService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ISysParamService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.SysParam;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUploadTaskDetailService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskDetailService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.UploadTaskDetail;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUploadTaskService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.UploadTask;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUserFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUserLoginInfoService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserLoginInfoService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.UserLoginInfo;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUserService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qiwenshare.common.result.RestResult;

+ 15 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/TranscodingService.java

@@ -0,0 +1,15 @@
+package vip.xiaonuo.disk.service;
+
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.dto.file.TranscodingReqDTO;
+
+/**
+ * 资源转码 service
+ */
+public interface TranscodingService {
+
+
+    CommonResult<String> transcodingVideo(TranscodingReqDTO transcodingReqDTO);
+
+
+}

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CommonFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CommonFileService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.ICommonFileService;
+import vip.xiaonuo.disk.service.ICommonFileService;
 import vip.xiaonuo.disk.domain.CommonFile;
 import vip.xiaonuo.disk.mapper.CommonFileMapper;
 import vip.xiaonuo.disk.vo.commonfile.CommonFileListVo;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/FilePermissionService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FilePermissionService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IFilePermissionService;
+import vip.xiaonuo.disk.service.IFilePermissionService;
 import vip.xiaonuo.disk.domain.FilePermission;
 import vip.xiaonuo.disk.mapper.FilePermissionMapper;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/FileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FileService.java

@@ -1,16 +1,14 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qiwenshare.common.exception.QiwenException;
 import com.qiwenshare.common.operation.FileOperation;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.security.SessionUtil;
-import vip.xiaonuo.disk.api.IFileService;
+import vip.xiaonuo.disk.service.IFileService;
 import vip.xiaonuo.disk.component.AsyncTaskComp;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.FileBean;

+ 3 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/FiletransferService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FiletransferService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSON;
@@ -7,9 +7,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.MimeUtils;
-import com.qiwenshare.common.util.security.JwtUser;
 import com.qiwenshare.common.util.security.SessionUtil;
-import vip.xiaonuo.disk.api.IFiletransferService;
+import vip.xiaonuo.disk.service.IFiletransferService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.*;
 import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
@@ -17,7 +16,6 @@ import vip.xiaonuo.disk.dto.file.PreviewDTO;
 import vip.xiaonuo.disk.dto.file.UploadFileDTO;
 import vip.xiaonuo.disk.io.QiwenFile;
 import vip.xiaonuo.disk.mapper.*;
-import vip.xiaonuo.disk.util.QiwenFileUtil;
 import vip.xiaonuo.disk.vo.file.UploadFileVo;
 import com.qiwenshare.ufop.constant.StorageTypeEnum;
 import com.qiwenshare.ufop.constant.UploadFileStatusEnum;
@@ -151,6 +149,7 @@ public class FiletransferService implements IFiletransferService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void uploadFile(HttpServletRequest request, UploadFileDTO uploadFileDto, String userId) {
 
         UploadFile uploadFile = new UploadFile();

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/NoticeService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/NoticeService.java

@@ -1,9 +1,9 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.INoticeService;
+import vip.xiaonuo.disk.service.INoticeService;
 import vip.xiaonuo.disk.domain.Notice;
 import vip.xiaonuo.disk.dto.notice.NoticeListDTO;
 import vip.xiaonuo.disk.mapper.NoticeMapper;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/OperationLogService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/OperationLogService.java

@@ -1,9 +1,9 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IOperationLogService;
+import vip.xiaonuo.disk.service.IOperationLogService;
 import vip.xiaonuo.disk.domain.OperationLogBean;
 import vip.xiaonuo.disk.mapper.OperationLogMapper;
 import org.springframework.stereotype.Service;

+ 2 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/RecoveryFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/RecoveryFileService.java

@@ -1,10 +1,9 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IRecoveryFileService;
+import vip.xiaonuo.disk.service.IRecoveryFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.RecoveryFile;
 import vip.xiaonuo.disk.domain.UserFile;

+ 2 - 10
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ShareFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareFileService.java

@@ -1,23 +1,15 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
-import com.alibaba.fastjson2.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IShareFileService;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.domain.Share;
+import vip.xiaonuo.disk.service.IShareFileService;
 import vip.xiaonuo.disk.domain.ShareFile;
-import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.mapper.ShareFileMapper;
-import vip.xiaonuo.disk.mapper.ShareMapper;
-import vip.xiaonuo.disk.mapper.UserFileMapper;
 import vip.xiaonuo.disk.vo.share.ShareFileListVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j

+ 2 - 6
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ShareService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareService.java

@@ -1,14 +1,10 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.domain.RecoveryFile;
+import vip.xiaonuo.disk.service.IShareService;
 import vip.xiaonuo.disk.domain.Share;
-import vip.xiaonuo.disk.domain.ShareFile;
 import vip.xiaonuo.disk.dto.sharefile.ShareListDTO;
-import vip.xiaonuo.disk.mapper.RecoveryFileMapper;
 import vip.xiaonuo.disk.mapper.ShareMapper;
-import vip.xiaonuo.disk.vo.share.ShareFileListVO;
 import vip.xiaonuo.disk.vo.share.ShareListVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/StorageService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/StorageService.java

@@ -1,8 +1,8 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IStorageService;
+import vip.xiaonuo.disk.service.IStorageService;
 import vip.xiaonuo.disk.domain.StorageBean;
 import vip.xiaonuo.disk.domain.SysParam;
 import vip.xiaonuo.disk.mapper.StorageMapper;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/SysParamService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/SysParamService.java

@@ -1,8 +1,8 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.ISysParamService;
+import vip.xiaonuo.disk.service.ISysParamService;
 import vip.xiaonuo.disk.domain.SysParam;
 import vip.xiaonuo.disk.mapper.SysParamMapper;
 import lombok.extern.slf4j.Slf4j;

+ 106 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/TranscodingServiceImpl.java

@@ -0,0 +1,106 @@
+package vip.xiaonuo.disk.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qiwenshare.common.util.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.domain.FileBean;
+import vip.xiaonuo.disk.domain.UserFile;
+import vip.xiaonuo.disk.dto.file.TranscodingReqDTO;
+import vip.xiaonuo.disk.mapper.FileMapper;
+import vip.xiaonuo.disk.mapper.UserFileMapper;
+import vip.xiaonuo.disk.service.TranscodingService;
+import vip.xiaonuo.disk.util.VideoConverter;
+
+import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 资源转码 service
+ * @author jinjilong
+ */
+@Service
+@Slf4j
+public class TranscodingServiceImpl implements TranscodingService {
+
+    @Resource
+    private VideoConverter videoConverter;
+
+    @Resource
+    private FileMapper fileMapper;
+
+    @Resource
+    private UserFileMapper userFileMapper;
+
+    @Override
+    public CommonResult<String> transcodingVideo(TranscodingReqDTO transcodingReqDTO) {
+        // 校验目标文件是否存在,是否是本人的
+        String userId = StpLoginUserUtil.getLoginUser().getId();
+        QueryWrapper<UserFile> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(UserFile::getFileId, transcodingReqDTO.getFileId());
+        UserFile userFile = userFileMapper.selectOne(queryWrapper);
+        if (userFile == null || !userFile.getUserId().equals(userId)) {
+            return CommonResult.error("文件不存在或不是本人的");
+        }
+        FileBean fileBean = fileMapper.selectById(userFile.getFileId());
+        if (fileBean == null) {
+            return CommonResult.error("文件不存在");
+        }
+        // 构建转码格式列表
+        ArrayList<String> formatList = new ArrayList<>();
+        formatList.add(transcodingReqDTO.getFormat());
+        // 判断视频还是图片
+        if (transcodingReqDTO.getTranscodingType() == 0) {
+            try {
+                // 转码视频
+                // mp4 wmv avi flv mpeg mpg rmvb mov 互相转
+                videoConverter.convertAndUpload(fileBean.getFileUrl(), fileBean.getFileId(), new String[]{transcodingReqDTO.getFormat()});
+                // 转换后把文件信息新增到数据库
+                FileBean newFile = new FileBean();
+                newFile.setFileId(IdUtil.simpleUUID());
+                newFile.setFileUrl(fileBean.getFileId() + "." + transcodingReqDTO.getFormat());
+                newFile.setCreateUserId(userId);
+                newFile.setFileSize(videoConverter.getConverterFileSize(fileBean.getFileId() + "." + transcodingReqDTO.getFormat()));
+                newFile.setFileStatus(1);
+                newFile.setIdentifier(fileBean.getIdentifier());
+                newFile.setStorageType(3);
+                newFile.setCreateTime(DateUtil.getCurrentTime());
+                fileMapper.insert(newFile);
+                UserFile newUserFile = new UserFile();
+                newUserFile.setUserFileId(IdUtil.simpleUUID());
+                newUserFile.setCreateUserId(userId);
+                newUserFile.setDeleteFlag(0);
+                newUserFile.setExtendName(transcodingReqDTO.getFormat());
+                newUserFile.setFileId(newFile.getFileId());
+                newUserFile.setFileName(userFile.getFileName());
+                newUserFile.setFilePath(userFile.getFilePath());
+                newUserFile.setIsDir(userFile.getIsDir());
+                newUserFile.setUserId(userId);
+                newUserFile.setCreateTime(DateUtil.getCurrentTime());
+                newUserFile.setUploadTime(DateUtil.getCurrentTime());
+                userFileMapper.insert(newUserFile);
+            } catch (Exception ex) {
+                log.error(ex.getMessage());
+            }
+        } else if (transcodingReqDTO.getTranscodingType() == 1) {
+            // 转码文档
+            // pdf doc docx ppt pptx xls xlsx
+            // doc转docx,ppt转pptx,xls转xlsx 所有均转pdf
+
+
+        }
+        return null;
+    }
+
+
+
+
+
+}

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UploadTaskDetailService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskDetailService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IUploadTaskDetailService;
+import vip.xiaonuo.disk.service.IUploadTaskDetailService;
 import vip.xiaonuo.disk.domain.UploadTaskDetail;
 import vip.xiaonuo.disk.mapper.UploadTaskDetailMapper;
 import org.springframework.stereotype.Service;

+ 2 - 8
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UploadTaskService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskService.java

@@ -1,17 +1,11 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IUploadTaskDetailService;
-import vip.xiaonuo.disk.api.IUploadTaskService;
+import vip.xiaonuo.disk.service.IUploadTaskService;
 import vip.xiaonuo.disk.domain.UploadTask;
-import vip.xiaonuo.disk.domain.UploadTaskDetail;
-import vip.xiaonuo.disk.mapper.UploadTaskDetailMapper;
 import vip.xiaonuo.disk.mapper.UploadTaskMapper;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.Resource;
-import java.util.List;
-
 @Service
 public class UploadTaskService extends ServiceImpl<UploadTaskMapper, UploadTask> implements IUploadTaskService {
 

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.IdUtil;
@@ -10,10 +10,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qiwenshare.common.constant.FileConstant;
 import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.RecoveryFile;
 import vip.xiaonuo.disk.domain.UserFile;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserLoginInfoService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserLoginInfoService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IUserLoginInfoService;
+import vip.xiaonuo.disk.service.IUserLoginInfoService;
 import vip.xiaonuo.disk.domain.UserLoginInfo;
 import vip.xiaonuo.disk.mapper.UserLoginInfoMapper;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson2.JSON;
@@ -9,7 +9,7 @@ import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.HashUtils;
 import com.qiwenshare.common.util.PasswordUtil;
 import com.qiwenshare.common.util.security.JwtUser;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.component.JwtComp;
 import vip.xiaonuo.disk.component.UserDealComp;
 import vip.xiaonuo.disk.controller.UserController;

+ 155 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/OfficeConverter.java

@@ -0,0 +1,155 @@
+package vip.xiaonuo.disk.util;
+
+import io.minio.*;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class OfficeConverter {
+
+
+//    @Value("${ufop.minio.endpoint}")
+//    private String minioEndpoint;
+//
+//    @Value("${ufop.minio.access-key}")
+//    private String accessKey;
+//
+//    @Value("${ufop.minio.secret-key}")
+//    private String secretKey;
+//
+//    @Value("${ufop.minio.bucket-name}")
+//    private String bucketName;
+
+    private static final MinioClient minioClient = MinioClient.builder()
+            .endpoint("http:47.93.185.192:10005")
+            .credentials("admin", "Aa123456")
+            .build();
+
+    private static final String LIBRE_OFFICE_PATH = "soffice"; // Linux路径
+
+    public static void main(String[] args) {
+        try {
+            convertAndUpload("netdisk", "upload/20241010/fba210e119de04088439e64b062665da.doc", "netdisk", "665da.docx");
+//            convertAndUpload("netdisk", "upload/20240705/7faa77badef7a854e3bf664a2ddb1a4f.ppt", "netdisk", "b1a4f.pptx");
+//            convertAndUpload("netdisk", "upload/20250611/答辩会议室号.xls", "netdisk", "室号.xlsx");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void convertAndUpload(String inputBucket, String inputFile,
+                                        String outputBucket, String outputFile) throws Exception {
+        // 1. 从MinIO下载文件
+        File tempInput = downloadFromMinio(inputBucket, inputFile);
+
+        // 2. 执行LibreOffice转换
+        File tempOutput = convertWithLibreOffice(tempInput, getOutputFormat(outputFile));
+
+        // 3. 上传到MinIO
+        uploadToMinio(outputBucket, outputFile, tempOutput);
+
+        // 4. 清理临时文件
+        deleteFiles(tempInput, tempOutput);
+    }
+
+    private static File downloadFromMinio(String bucket, String objectName) throws Exception {
+        // 使用UUID确保唯一性
+        String uniqueId = UUID.randomUUID().toString();
+        Path tempDir = Files.createTempDirectory("minio-download-");
+        Path tempPath = tempDir.resolve(uniqueId + ".tmp");
+
+        try {
+            minioClient.downloadObject(
+                    DownloadObjectArgs.builder()
+                            .bucket(bucket)
+                            .object(objectName)
+                            .filename(tempPath.toString())
+                            .build());
+            return tempPath.toFile();
+        } catch (Exception e) {
+            // 清理失败的文件
+            Files.deleteIfExists(tempPath);
+            Files.deleteIfExists(tempDir);
+            throw e;
+        }
+    }
+
+    private static File convertWithLibreOffice(File inputFile, String outputFormat) throws Exception {
+        File outputFile = File.createTempFile("converted-", "." + outputFormat);
+
+        ProcessBuilder pb = new ProcessBuilder(
+                LIBRE_OFFICE_PATH,
+                "--headless",
+                "--convert-to", outputFormat,
+                "--outdir", outputFile.getParent(),
+                inputFile.getAbsolutePath());
+
+        Process process = pb.start();
+
+        // 等待转换完成(最长等待120秒)
+        if (!process.waitFor(120, TimeUnit.SECONDS)) {
+            process.destroyForcibly();
+            throw new RuntimeException("LibreOffice转换超时");
+        }
+
+        if (process.exitValue() != 0) {
+            throw new RuntimeException("LibreOffice转换失败,退出码: " + process.exitValue());
+        }
+
+        // 查找生成的文件(LibreOffice可能生成不同名称的文件)
+        File convertedFile = new File(outputFile.getParent(),
+                inputFile.getName().replaceAll("\\.\\w+$", "." + outputFormat));
+
+        if (!convertedFile.exists()) {
+            throw new FileNotFoundException("未找到转换后的文件: " + convertedFile.getAbsolutePath());
+        }
+
+        return convertedFile;
+    }
+
+    private static void uploadToMinio(String bucket, String objectName, File file) throws Exception {
+        minioClient.uploadObject(
+                UploadObjectArgs.builder()
+                        .bucket(bucket)
+                        .object(objectName)
+                        .filename(file.getAbsolutePath())
+                        .contentType(getMimeType(objectName))
+                        .build());
+    }
+
+    private static void deleteFiles(File... files) {
+        for (File f : files) {
+            if (f != null && f.exists()) {
+                f.delete();
+            }
+        }
+    }
+
+    private static String getOutputFormat(String outputFile) {
+        if (outputFile.endsWith(".docx")) {
+            return "docx";
+        }
+        if (outputFile.endsWith(".pptx")) {
+            return "pptx";
+        }
+        if (outputFile.endsWith(".xlsx")) {
+            return "xlsx";
+        }
+        throw new IllegalArgumentException("不支持的输出格式: " + outputFile);
+    }
+
+    private static String getMimeType(String fileName) {
+        return switch (fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase()) {
+            case "docx" -> "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+            case "pptx" -> "application/vnd.openxmlformats-officedocument.presentationml.presentation";
+            case "xlsx" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+            default -> "application/octet-stream";
+        };
+    }
+
+}

+ 251 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/PdfUtils.java

@@ -0,0 +1,251 @@
+package vip.xiaonuo.disk.util;
+
+import io.minio.DownloadObjectArgs;
+import io.minio.MinioClient;
+import io.minio.UploadObjectArgs;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.UUID;
+
+@Component
+public class PdfUtils {
+
+//    @Value("${ufop.minio.endpoint}")
+//    private String minioEndpoint;
+//
+//    @Value("${ufop.minio.access-key}")
+//    private String accessKey;
+//
+//    @Value("${ufop.minio.secret-key}")
+//    private String secretKey;
+//
+//    @Value("${ufop.minio.bucket-name}")
+//    private String bucketName;
+
+    private String minioEndpoint = "http:47.93.185.192:10005";
+
+    private String accessKey = "admin";
+
+    private String secretKey = "Aa123456";
+
+    private String bucketName = "netdisk";
+
+
+    private final MinioClient minioClient;
+    private final String tempDir = System.getProperty("java.io.tmpdir") + "/minio-converter/";
+
+    public PdfUtils() {
+        this.minioClient = MinioClient.builder()
+                .endpoint(minioEndpoint)
+                .credentials(accessKey, secretKey)
+                .build();
+        createTempDir();
+    }
+
+    private void createTempDir() {
+        File dir = new File(tempDir);
+        if (!dir.exists() && !dir.mkdirs()) {
+            throw new RuntimeException("无法创建临时目录: " + tempDir);
+        }
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        PdfUtils pdfUtils = new PdfUtils();
+        pdfUtils.convertToPdf("upload/20250611/答辩会议室号.xls","室号.pdf");
+    }
+
+    @Async
+    public void convertToPdf(String objectName, String targetFolder) throws Exception {
+        long start = System.currentTimeMillis();
+        File tempFile = null;
+
+        try {
+            // 1. 下载源文件
+            tempFile = downloadFile(objectName);
+
+            // 2. 执行转换
+            String outputPath = convertToPdfLocal(tempFile.getAbsolutePath(), targetFolder);
+
+            // 3. 上传转换结果
+            uploadToMinio(outputPath, targetFolder);
+
+        } finally {
+            if (tempFile != null && tempFile.exists()) {
+                tempFile.delete();
+            }
+            cleanTempDir();
+        }
+        System.out.println("总耗时:" + (System.currentTimeMillis() - start) + "ms");
+    }
+
+    private File downloadFile(String objectName) throws Exception {
+        // 提取纯文件名(去除路径)
+        String fileName = new File(objectName).getName();
+        // 生成唯一临时文件名
+        String uniqueName = UUID.randomUUID() + "_" + fileName;
+        File tempFile = new File(tempDir, uniqueName);
+
+        minioClient.downloadObject(
+                DownloadObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object(objectName)
+                        .filename(tempFile.getAbsolutePath())
+                        .build());
+        return tempFile;
+    }
+
+    // 新增路径创建工具方法
+    private void ensureDirectoryExists(String path) {
+        File dir = new File(path).getParentFile();
+        if (dir != null && !dir.exists()) {
+            if (!dir.mkdirs()) {
+                throw new RuntimeException("无法创建目录: " + dir.getAbsolutePath());
+            }
+        }
+    }
+
+    private String convertToPdfLocal(String filePath, String targetFolder) {
+        String osName = System.getProperty("os.name").toLowerCase();
+        String outputPath = tempDir + "converted_" + System.currentTimeMillis() + ".pdf";
+        // 在执行转换前确保输出目录存在
+        ensureDirectoryExists(outputPath);
+        try {
+            ProcessBuilder processBuilder = new ProcessBuilder();
+            if (osName.contains("windows")) {
+                processBuilder.command(
+                        "cmd.exe", "/c",
+                        "soffice", "--headless", "--convert-to", "pdf",
+                        filePath, "--outdir", tempDir);
+            } else {
+                processBuilder.command(
+                        "soffice", "--headless", "--convert-to", "pdf:writer_pdf_Export",
+                        filePath, "--outdir", tempDir);
+            }
+
+            Process process = processBuilder.start();
+            int exitCode = process.waitFor();
+            if (exitCode != 0) {
+                throw new RuntimeException("转换失败,退出码:" + exitCode);
+            }
+
+
+            // 查找生成的PDF文件
+            File outputDir = new File(tempDir);
+            File[] files = outputDir.listFiles((dir, name) ->
+                    name.toLowerCase().endsWith(".pdf") && !name.equals(filePath));
+
+            if (files != null && files.length > 0) {
+                File pdfFile = files[0];
+                Files.move(pdfFile.toPath(), new File(outputPath).toPath());
+                return outputPath;
+            }
+            throw new FileNotFoundException("未找到生成的PDF文件");
+
+        } catch (IOException | InterruptedException e) {
+            throw new RuntimeException("转换过程中发生错误", e);
+        }
+    }
+
+    private void uploadToMinio(String filePath, String targetFolder) throws Exception {
+        String fileName = new File(filePath).getName();
+        String objectName = targetFolder.endsWith("/") ?
+                targetFolder + fileName : targetFolder + "/" + fileName;
+
+        minioClient.uploadObject(
+                UploadObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object(objectName)
+                        .filename(filePath)
+                        .build());
+    }
+
+    private void cleanTempDir() {
+        File[] files = new File(tempDir).listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (file.getName().startsWith("converted_") ||
+                        file.getName().startsWith("temp_")) {
+                    file.delete();
+                }
+            }
+        }
+    }
+
+
+    public String getFileUrl(String objectName) {
+        return minioEndpoint + "/" + bucketName + "/" + objectName;
+    }
+
+//    public List<String> convertToPng(String pdfObjectName, int pages) throws Exception {
+//        File tempPdf = downloadFile(pdfObjectName);
+//        List<String> pngUrls = new ArrayList<>();
+//
+//        try (PDDocument document = PDDocument.load(tempPdf)) {
+//            PDFRenderer renderer = new PDFRenderer(document);
+//            String baseName = tempPdf.getName().replace(".pdf", "");
+//
+//            for (int i = 0; i < pages; i++) {
+//                BufferedImage image = renderer.renderImageWithDPI(i, 150);
+//                String outputPath = tempDir + baseName + "_" + (i + 1) + ".png";
+//                ImageIO.write(image, "PNG", new File(outputPath));
+//                uploadToMinio(outputPath, "png/" + baseName);
+//                pngUrls.add(getFileUrl("png/" + baseName + "/" + new File(outputPath).getName()));
+//            }
+//        } finally {
+//            tempPdf.delete();
+//            cleanTempDir();
+//        }
+//        return pngUrls;
+//    }
+//
+//    /***
+//     * PDF文件转PNG图片,全部页数
+//     *
+//     * @param PdfFilePath pdf文件路径 物理路径
+//     * @param dstImgFolder 图片存放的文件夹
+//     * @param dpi dpi越大转换后越清晰,相对转换速度越慢 dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96
+//     * @return
+//     */
+//    public int pdf2Image(String PdfFilePath, String dstImgFolder, int dpi) {
+//        int pages = 1;
+//        PDDocument pdDocument;
+//        try {
+//            File file = new File(PdfFilePath);
+//            while (!file.exists()) {
+//                System.out.println("文件未生成,等待1秒");
+//                Thread.sleep(1000);
+//            }
+//            pdDocument = PDDocument.load(file);
+//            int dot = PdfFilePath.lastIndexOf('.');
+//            int lastSep = PdfFilePath.lastIndexOf(File.separator) + 1;
+//            String imagePDFName = PdfFilePath.substring(lastSep, dot); // 获取图片文件名
+//
+//            PDFRenderer renderer = new PDFRenderer(pdDocument);
+//            /* dpi越大转换后越清晰,相对转换速度越慢 */
+//            pages = pdDocument.getNumberOfPages();
+//            StringBuffer imgFilePath = null;
+//            for (int i = 0; i < pages; i++) {
+//                String imgFilePathPrefix = dstImgFolder + File.separator + imagePDFName;
+//                imgFilePath = new StringBuffer();
+//                imgFilePath.append(imgFilePathPrefix);
+//                imgFilePath.append("_");
+//                imgFilePath.append(String.valueOf(i + 1));
+//                imgFilePath.append(".png");
+//                File dstFile = new File(imgFilePath.toString());
+//                BufferedImage image = renderer.renderImageWithDPI(i, dpi);
+//                ImageIO.write(image, "png", dstFile);
+//            }
+//            System.out.println("PDF文档转PNG图片成功!");
+//        } catch (IOException | InterruptedException e) {
+//            e.printStackTrace();
+//        }
+//        return pages;
+//    }
+
+}

+ 329 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/VideoConverter.java

@@ -0,0 +1,329 @@
+package vip.xiaonuo.disk.util;
+
+import io.minio.*;
+import io.minio.errors.ErrorResponseException;
+import io.minio.errors.InvalidResponseException;
+import io.minio.errors.XmlParserException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.*;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class VideoConverter {
+
+    // MinIO配置
+
+    @Value("${ufop.minio.endpoint}")
+    private String MINIO_ENDPOINT;
+    @Value("${ufop.minio.access-key}")
+    private String ACCESS_KEY;
+    @Value("${ufop.minio.secret-key}")
+    private String SECRET_KEY;
+    @Value("${ufop.minio.bucket-name}")
+    private String BUCKET_NAME;
+    @Value("${ufop.minio.FFMPEG_PATH}")
+    private String FFMPEG_PATH;
+
+
+    public static void main(String[] args) throws Exception {
+        // 示例:转换input.mp4到多种格式
+//        convertAndUpload("upload/20250611/4d22cdad68fac9a45c8e647e5bb02cc2.mp4", "output", new String[]{"avi"});
+    }
+
+    public void convertAndUpload(String inputKey, String outputPrefix, String[] formats) throws Exception {
+        MinioClient minioClient = MinioClient.builder()
+                .endpoint(MINIO_ENDPOINT)
+                .credentials(ACCESS_KEY, SECRET_KEY)
+                .build();
+
+        // 创建临时目录
+        File tempDir = new File("temp");
+        if (!tempDir.exists()) {
+            tempDir.mkdir();
+        }
+        List<File> filesToDelete = new ArrayList<>(); // 待删除文件列表
+
+        try {
+            // 下载源文件
+            File localInput = new File(tempDir, inputKey);
+            downloadFromMinio(minioClient, BUCKET_NAME, inputKey, localInput);
+            filesToDelete.add(localInput); // 添加到删除列表
+            // 执行格式转换
+            for (String format : formats) {
+                File outputFile = new File(tempDir, outputPrefix + "." + format);
+                convertVideo(localInput.getAbsolutePath(), outputFile.getAbsolutePath(), format);
+
+                // 上传转换后的文件
+                uploadToMinio(minioClient, BUCKET_NAME, outputFile.getName(), outputFile);
+                filesToDelete.add(outputFile); // 添加到删除列表
+            }
+        } finally {
+            // 清理临时文件(保留目录结构)
+            for (File file : filesToDelete) {
+                if (file.exists() && !file.delete()) {
+                    System.err.println("警告:无法删除临时文件 " + file.getAbsolutePath());
+                }
+            }
+        }
+    }
+
+//    private void convertVideo(String inputPath, String outputPath, String format) throws IOException, InterruptedException {
+//        List<String> command = new ArrayList<>();
+//        command.add(FFMPEG_PATH);
+//        command.add("-i");
+//        command.add(inputPath);
+//        command.add("-c:v");
+//        command.add("libx264");
+//        command.add("-c:a");
+//        command.add("aac");
+//        command.add(outputPath);
+//
+//        ProcessBuilder pb = new ProcessBuilder(command);
+//        pb.redirectErrorStream(true);
+//        Process process = pb.start();
+//
+//        // 读取输出日志
+//        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+//            String line;
+//            while ((line = reader.readLine()) != null) {
+//                System.out.println(line);
+//            }
+//        }
+//
+//        int exitCode = process.waitFor();
+//        if (exitCode != 0) {
+//            throw new RuntimeException("FFmpeg转换失败,退出码:" + exitCode);
+//        }
+//    }
+
+    // 修改convertVideo方法以接受文件路径参数
+    private void convertVideo(String inputPath, String outputPath, String format)
+            throws IOException, InterruptedException {
+
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-y"); // 覆盖输出文件(避免重复转换问题)
+        command.add("-i");
+        command.add(inputPath);
+        command.add("-c:v");
+        command.add("libx264");
+        command.add("-c:a");
+        command.add("aac");
+        command.add(outputPath);
+
+        ProcessBuilder pb = new ProcessBuilder(command);
+        pb.redirectErrorStream(true);
+        Process process = pb.start();
+
+        // 读取输出日志
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                System.out.println(line);
+            }
+        }
+
+        int exitCode = process.waitFor();
+        if (exitCode != 0) {
+            throw new RuntimeException("FFmpeg转换失败,退出码:" + exitCode);
+        }
+    }
+
+    private static void downloadFromMinio(MinioClient client, String bucket, String object, File dest) throws Exception {
+        if (!client.bucketExists(BucketExistsArgs.builder().bucket(bucket).build())) {
+            client.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
+        }
+        client.downloadObject(
+                DownloadObjectArgs.builder()
+                        .bucket(bucket)
+                        .object(object)
+                        .filename(dest.getAbsolutePath())
+                        .build()
+        );
+    }
+
+    private static void uploadToMinio(MinioClient client, String bucket, String object, File file) throws Exception {
+        client.uploadObject(
+                UploadObjectArgs.builder()
+                        .bucket(bucket)
+                        .object(object)
+                        .filename(file.getAbsolutePath())
+                        .contentType(getMimeType(object))
+                        .build()
+        );
+    }
+
+    private static String getMimeType(String fileName) {
+        return switch (fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase()) {
+            case "mp4" -> "video/mp4";
+            case "wmv" -> "video/x-ms-wmv";
+            case "avi" -> "video/avi";
+            case "flv" -> "video/x-flv";
+            case "mpeg" -> "video/mpeg";
+            case "mpg" -> "video/mpeg";
+            case "rmvb" -> "application/vnd.rn-realmedia-vbr";
+            case "mov" -> "video/quicktime";
+            default -> "application/octet-stream";
+        };
+    }
+
+    private static void deleteDirectory(File dir) {
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for (File f : files) {
+                if (f.isDirectory()) {
+                    deleteDirectory(f);
+                } else {
+                    f.delete();
+                }
+            }
+        }
+        dir.delete();
+    }
+
+
+    /**
+     * 获取转换后的文件大小
+     */
+    public Long getConverterFileSize(String filePath) {
+        Long size = 0L;
+        // 初始化MinIO客户端(需替换您的配置)
+        MinioClient minioClient = MinioClient.builder()
+                .endpoint(MINIO_ENDPOINT)
+                .credentials(ACCESS_KEY, SECRET_KEY)
+                .build();
+
+        try {
+            // 1. 构建查询参数
+            StatObjectArgs statArgs = StatObjectArgs.builder()
+                    .bucket(BUCKET_NAME)
+                    .object(filePath)
+                    .build();
+
+            // 2. 获取元数据
+            StatObjectResponse statObjectResponse = minioClient.statObject(statArgs);
+
+            // 3. 提取文件大小
+            size = statObjectResponse.size();
+            System.out.printf("文件大小: %.2f MB%n", size / (1024.0 * 1024.0));
+
+        } catch (Exception e) {
+
+        }
+        return size;
+    }
+
+
+
+
+//
+//    public static void convertAndUpload(String inputObjectPath, String outputPrefix, String[] formats) throws Exception {
+//        MinioClient minioClient = MinioClient.builder()
+//                .endpoint(MINIO_ENDPOINT)
+//                .credentials(ACCESS_KEY, SECRET_KEY)
+//                .build();
+//
+//        // 1. 从MinIO获取输入流
+//        InputStream minioInputStream = minioClient.getObject(
+//                GetObjectArgs.builder()
+//                        .bucket(BUCKET_NAME)
+//                        .object(inputObjectPath)
+//                        .build()
+//        );
+//
+//        // 2. 执行格式转换
+//        for (String format : formats) {
+//            // 创建FFmpeg进程
+//            ProcessBuilder pb = new ProcessBuilder(FFMPEG_PATH,
+//                    "-i", "pipe:0",          // 从标准输入读取
+//                    "-c:v", "mpeg4",         // 示例编码器配置
+//                    "-c:a", "pcm_s16le",
+//                    "-f", format,            // 强制指定输出格式
+//                    "pipe:1"                 // 输出到标准输出
+//            );
+//
+//            pb.redirectErrorStream(true);
+//            Process ffmpegProcess = pb.start();
+//
+//            // 3. 创建上传任务
+//            CompletableFuture.runAsync(() -> {
+//                try {
+//                    // 构建MinIO上传参数
+//                    PutObjectArgs putArgs = PutObjectArgs.builder()
+//                            .bucket(BUCKET_NAME)
+//                            .object(getOutputObjectName(inputObjectPath, format))
+//                            .contentType(getMimeType(format))
+//                            .build();
+//
+//                    // 获取可写的OutputStream(正确方式)
+//                    try () {
+//                        // 创建管道线程(单向传输:FFmpeg → MinIO)
+//                        Thread outputThread = new Thread(() -> {
+//                            try {
+//                                pipeStreams(
+//                                        ffmpegProcess.getInputStream(),
+//                                        minioOutputStream
+//                                );
+//                            } catch (IOException e) {
+//                                throw new RuntimeException(e);
+//                            }
+//                        });
+//
+//                        outputThread.start();
+//                        outputThread.join();
+//
+//                        // 等待FFmpeg进程完成
+//                        int exitCode = ffmpegProcess.waitFor();
+//                        if (exitCode != 0) {
+//                            throw new RuntimeException("FFmpeg转换失败,退出码:" + exitCode);
+//                        }
+//                    }
+//                } catch (Exception e) {
+//                    throw new RuntimeException("转换/上传过程出错", e);
+//                }
+//            }).join();
+//        }
+//    }
+//
+//    private static void pipeStreams(InputStream src, OutputStream dest) throws IOException {
+//        byte[] buffer = new byte[8192];
+//        int bytesRead;
+//        while ((bytesRead = src.read(buffer)) != -1) {
+//            dest.write(buffer, 0, bytesRead);
+//        }
+//    }
+//
+//    private static String getOutputObjectName(String inputPath, String format) {
+//        String baseName = inputPath.substring(0, inputPath.lastIndexOf('.'));
+//        return baseName + "_converted." + format;
+//    }
+//
+//    private static String getMimeType(String format) {
+//        String lowerFormat = format.toLowerCase();
+//        switch (lowerFormat) {
+//            case "mp4":
+//                return "video/mp4";
+//            case "wmv":
+//                return "video/x-ms-wmv";
+//            case "avi":
+//                return "video/x-msvideo";
+//            case "flv":
+//                return "video/x-flv";
+//            case "mpeg":
+//            case "mpg":
+//                return "video/mpeg";
+//            case "rmvb":
+//                return "application/vnd.rn-realmedia-vbr";
+//            case "mov":
+//                return "video/quicktime";
+//            default:
+//                return "application/octet-stream";
+//        }
+//    }
+
+}