Browse Source

feat: heic 2 jpg

shc 5 months ago
parent
commit
c23c8019c6

+ 242 - 237
hnqz-upms/hnqz-upms-biz/pom.xml

@@ -1,264 +1,269 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
-		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.qunzhixinxi</groupId>
-		<artifactId>hnqz-upms</artifactId>
-		<version>3.9.0</version>
-	</parent>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns="http://maven.apache.org/POM/4.0.0"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>com.qunzhixinxi</groupId>
+    <artifactId>hnqz-upms</artifactId>
+    <version>3.9.0</version>
+  </parent>
 
-	<artifactId>hnqz-upms-biz</artifactId>
-	<packaging>jar</packaging>
+  <artifactId>hnqz-upms-biz</artifactId>
+  <packaging>jar</packaging>
 
-	<description>hnqz 通用用户权限管理系统业务处理模块</description>
+  <description>hnqz 通用用户权限管理系统业务处理模块</description>
 
-	<dependencies>
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-sequence</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-mq</artifactId>
-		</dependency>
-		<!--upms api、model 模块-->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-upms-api</artifactId>
-		</dependency>
-		<!--日志处理-->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-log</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-data</artifactId>
-		</dependency>
-		<!--文件系统-->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-oss</artifactId>
-		</dependency>
-		<!--注册中心客户端-->
-		<dependency>
-			<groupId>com.alibaba.cloud</groupId>
-			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-		</dependency>
-		<!--配置中心客户端-->
-		<dependency>
-			<groupId>com.alibaba.cloud</groupId>
-			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-		</dependency>
-		<!--spring security 、oauth、jwt依赖-->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-security</artifactId>
-		</dependency>
-		<!--支持动态路由配置 -->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-gateway</artifactId>
-		</dependency>
-		<!--sentinel 依赖-->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-sentinel</artifactId>
-		</dependency>
-		<!--路由控制-->
-		<dependency>
-			<groupId>com.qunzhixinxi</groupId>
-			<artifactId>hnqz-common-gray</artifactId>
-		</dependency>
-		<!--mybatis-->
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>mybatis-plus-boot-starter</artifactId>
-		</dependency>
-		<!-- druid 连接池 -->
-		<dependency>
-			<groupId>com.alibaba</groupId>
-			<artifactId>druid-spring-boot-starter</artifactId>
-		</dependency>
-		<!--mysql 驱动-->
-		<dependency>
-			<groupId>com.mysql</groupId>
-			<artifactId>mysql-connector-j</artifactId>
-		</dependency>
-		<!--DM8-->
-		<dependency>
-			<groupId>com.dameng</groupId>
-			<artifactId>DmJdbcDriver18</artifactId>
-		</dependency>
-		<!--web 模块-->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-		<!--undertow容器-->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-undertow</artifactId>
-		</dependency>
+  <dependencies>
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-sequence</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-mq</artifactId>
+    </dependency>
+    <!--upms api、model 模块-->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-upms-api</artifactId>
+    </dependency>
+    <!--日志处理-->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-log</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-data</artifactId>
+    </dependency>
+    <!--文件系统-->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-oss</artifactId>
+    </dependency>
+    <!--注册中心客户端-->
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+    </dependency>
+    <!--配置中心客户端-->
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+    </dependency>
+    <!--spring security 、oauth、jwt依赖-->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-security</artifactId>
+    </dependency>
+    <!--支持动态路由配置 -->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-gateway</artifactId>
+    </dependency>
+    <!--sentinel 依赖-->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-sentinel</artifactId>
+    </dependency>
+    <!--路由控制-->
+    <dependency>
+      <groupId>com.qunzhixinxi</groupId>
+      <artifactId>hnqz-common-gray</artifactId>
+    </dependency>
+    <!--mybatis-->
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus-boot-starter</artifactId>
+    </dependency>
+    <!-- druid 连接池 -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>druid-spring-boot-starter</artifactId>
+    </dependency>
+    <!--mysql 驱动-->
+    <dependency>
+      <groupId>com.mysql</groupId>
+      <artifactId>mysql-connector-j</artifactId>
+    </dependency>
+    <!--DM8-->
+    <dependency>
+      <groupId>com.dameng</groupId>
+      <artifactId>DmJdbcDriver18</artifactId>
+    </dependency>
+    <!--web 模块-->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+    <!--undertow容器-->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-undertow</artifactId>
+    </dependency>
 
-		<dependency>
-			<groupId>com.google.zxing</groupId>
-			<artifactId>core</artifactId>
-			<version>3.3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.zxing</groupId>
-			<artifactId>javase</artifactId>
-			<version>3.3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-test</artifactId>
-			<version>5.2.7.RELEASE</version>
-			<scope>compile</scope>
-		</dependency>
+    <dependency>
+      <groupId>com.google.zxing</groupId>
+      <artifactId>core</artifactId>
+      <version>3.3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.zxing</groupId>
+      <artifactId>javase</artifactId>
+      <version>3.3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-test</artifactId>
+      <version>5.2.7.RELEASE</version>
+      <scope>compile</scope>
+    </dependency>
 
-		<dependency>
-			<groupId>com.pig4cloud.excel</groupId>
-			<artifactId>excel-spring-boot-starter</artifactId>
-			<version>1.2.7</version>
-		</dependency>
+    <dependency>
+      <groupId>com.pig4cloud.excel</groupId>
+      <artifactId>excel-spring-boot-starter</artifactId>
+      <version>1.2.7</version>
+    </dependency>
 
-		<dependency>
-			<groupId>com.aliyun</groupId>
-			<artifactId>aliyun-java-sdk-core</artifactId>
-			<version>4.5.1</version>
-		</dependency>
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>aliyun-java-sdk-core</artifactId>
+      <version>4.5.1</version>
+    </dependency>
 
-		<dependency>
-			<groupId>com.aliyun</groupId>
-			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
-			<version>1.1.0</version>
-		</dependency>
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+      <version>1.1.0</version>
+    </dependency>
 
-		<!-- Excel导入导出 -->
-		<dependency>
-			<groupId>net.fenghaitao</groupId>
-			<artifactId>auto-excel</artifactId>
-			<version>2.0.0</version>
-		</dependency>
+    <!-- Excel导入导出 -->
+    <dependency>
+      <groupId>net.fenghaitao</groupId>
+      <artifactId>auto-excel</artifactId>
+      <version>2.0.0</version>
+    </dependency>
 
-		<dependency>
-			<groupId>com.deepoove</groupId>
-			<artifactId>poi-tl</artifactId>
-			<version>1.8.2</version>
-		</dependency>
+    <dependency>
+      <groupId>com.deepoove</groupId>
+      <artifactId>poi-tl</artifactId>
+      <version>1.8.2</version>
+    </dependency>
 
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi-ooxml</artifactId>
-			<version>4.1.2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi</artifactId>
-			<version>4.1.2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi-ooxml-schemas</artifactId>
-			<version>4.1.2</version>
-		</dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml</artifactId>
+      <version>4.1.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi</artifactId>
+      <version>4.1.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml-schemas</artifactId>
+      <version>4.1.2</version>
+    </dependency>
 
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<version>2.16.1</version>
-		</dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.16.1</version>
+    </dependency>
 
-		<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
-		<dependency>
-			<groupId>org.seleniumhq.selenium</groupId>
-			<artifactId>selenium-java</artifactId>
-			<version>4.0.0-alpha-6</version>
-		</dependency>
+    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
+    <dependency>
+      <groupId>org.seleniumhq.selenium</groupId>
+      <artifactId>selenium-java</artifactId>
+      <version>4.0.0-alpha-6</version>
+    </dependency>
 
 
+    <!-- https://mvnrepository.com/artifact/com.codeborne/phantomjsdriver -->
+    <dependency>
+      <groupId>com.codeborne</groupId>
+      <artifactId>phantomjsdriver</artifactId>
+      <version>1.4.4</version>
+    </dependency>
 
-		<!-- https://mvnrepository.com/artifact/com.codeborne/phantomjsdriver -->
-		<dependency>
-			<groupId>com.codeborne</groupId>
-			<artifactId>phantomjsdriver</artifactId>
-			<version>1.4.4</version>
-		</dependency>
 
+    <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>29.0-jre</version>
+    </dependency>
 
-		<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<version>29.0-jre</version>
-		</dependency>
+    <!-- https://mvnrepository.com/artifact/io.webfolder/cdp4j -->
+    <dependency>
+      <groupId>io.webfolder</groupId>
+      <artifactId>cdp4j</artifactId>
+      <version>3.0.15</version>
+    </dependency>
 
-		<!-- https://mvnrepository.com/artifact/io.webfolder/cdp4j -->
-		<dependency>
-			<groupId>io.webfolder</groupId>
-			<artifactId>cdp4j</artifactId>
-			<version>3.0.15</version>
-		</dependency>
 
+    <dependency>
+      <groupId>ru.yandex.qatools.ashot</groupId>
+      <artifactId>ashot</artifactId>
+      <version>1.5.4</version>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.mail</groupId>
+      <artifactId>javax.mail</artifactId>
+      <version>1.6.2</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-test</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
 
-		<dependency>
-			<groupId>ru.yandex.qatools.ashot</groupId>
-			<artifactId>ashot</artifactId>
-			<version>1.5.4</version>
-		</dependency>
-		<dependency>
-			<groupId>com.sun.mail</groupId>
-			<artifactId>javax.mail</artifactId>
-			<version>1.6.2</version>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-test</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
+    <!-- 重试机制 -->
+    <dependency>
+      <groupId>org.springframework.retry</groupId>
+      <artifactId>spring-retry</artifactId>
+      <version>1.2.4.RELEASE</version>
+    </dependency>
 
-		<!-- 重试机制 -->
-		<dependency>
-			<groupId>org.springframework.retry</groupId>
-			<artifactId>spring-retry</artifactId>
-			<version>1.2.4.RELEASE</version>
-		</dependency>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjweaver</artifactId>
+      <version>1.9.4</version>
+    </dependency>
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+      <version>5.7.7</version>
+      <scope>compile</scope>
+    </dependency>
 
-		<dependency>
-			<groupId>org.aspectj</groupId>
-			<artifactId>aspectjweaver</artifactId>
-			<version>1.9.4</version>
-		</dependency>
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.7.7</version>
-            <scope>compile</scope>
-        </dependency>
+    <dependency>
+      <groupId>net.coobird</groupId>
+      <artifactId>thumbnailator</artifactId>
+      <version>0.4.20</version>
+    </dependency>
+  </dependencies>
 
-    </dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-			<plugin>
-				<groupId>io.fabric8</groupId>
-				<artifactId>docker-maven-plugin</artifactId>
-				<configuration>
-					<skip>false</skip>
-				</configuration>
-			</plugin>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>io.fabric8</groupId>
+        <artifactId>docker-maven-plugin</artifactId>
+        <configuration>
+          <skip>false</skip>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
@@ -268,6 +273,6 @@
         </configuration>
       </plugin>
     </plugins>
-	</build>
+  </build>
 
 </project>

+ 266 - 209
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysFileServiceImpl.java

@@ -11,14 +11,20 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysFile;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.mapper.SysFileMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysFileService;
+import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils;
+import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils.TargetFile;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.oss.OssProperties;
 import com.qunzhixinxi.hnqz.common.oss.service.OssTemplate;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import java.io.IOException;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
+import org.apache.http.entity.ContentType;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -43,224 +49,275 @@ import java.util.Map;
 @Slf4j
 @Service
 @AllArgsConstructor
-public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements SysFileService {
-
-    private final OssProperties ossProperties;
-
-    private final OssTemplate minioTemplate;
-
-    private final UpmsConfig upmsConfig;
-
-    /**
-     * 上传文件
-     *
-     * @param file 文件
-     * @return 上传结果
-     */
-    @Override
-    public R<Map<String, String>> uploadFile(MultipartFile file) {
-        HnqzUser user = SecurityUtils.getUser();
-        return R.ok(upload(file, user.getUsername()));
+public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile>
+    implements SysFileService {
+
+  private final OssProperties ossProperties;
+
+  private final OssTemplate minioTemplate;
+
+  private final UpmsConfig upmsConfig;
+
+  private static final String LOCAL_TEMP_PATH =
+      OsEnvUtils.getEachEnvPaths().get(TargetFile.TEMP.getName());
+
+  /**
+   * 上传文件
+   *
+   * @param file 文件
+   * @return 上传结果
+   */
+  @Override
+  public R<Map<String, String>> uploadFile(MultipartFile file) {
+    HnqzUser user = SecurityUtils.getUser();
+    return R.ok(upload(file, user.getUsername()));
+  }
+
+  /**
+   * 上传文件
+   *
+   * @param file 文件
+   * @return 上传结果
+   */
+  @Override
+  public Map<String, String> upload(MultipartFile file, String username) {
+
+    String originalFilename = file.getOriginalFilename();
+
+    // 判断是否有重名的操作
+    String fileName = IdUtil.simpleUUID() + StrPool.DOT;
+    assert originalFilename != null;
+    if (originalFilename.endsWith(".heic") || originalFilename.endsWith(".HEIC")) {
+      fileName += "jpg";
+      try {
+        file = heic2jpg(file.getInputStream(), fileName);
+      } catch (Exception e) {
+        throw new RuntimeException("heic格式图片转换失败,请设置为兼容模式");
+      }
+
+    } else {
+      fileName += FileUtil.extName(originalFilename);
     }
 
-    /**
-     * 上传文件
-     *
-     * @param file 文件
-     * @return 上传结果
-     */
-    @Override
-    public Map<String, String> upload(MultipartFile file, String username) {
-        // 判断是否有重名的操作
-        String fileName = IdUtil.simpleUUID() + StrPool.DOT + FileUtil.extName(file.getOriginalFilename());
-        Map<String, String> resultMap = new HashMap<>(5);
-        resultMap.put("bucketName", ossProperties.getBucketName());
-        resultMap.put("orgFileName", file.getOriginalFilename());
-        resultMap.put("fileName", DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN).format(LocalDateTime.now()) + File.separator + fileName);
-        String url = String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
-        resultMap.put("url", url);
-
-        try {
-            minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
-            // 文件管理数据记录,收集管理追踪文件
-            SysFile sysFile = fileLog(file, fileName, url, username);
-            resultMap.put("fileId", String.valueOf(sysFile.getId()));
-
-        } catch (Exception e) {
-            log.error("上传失败", e);
-            throw new RuntimeException(e.getLocalizedMessage());
-        }
-        return resultMap;
+    // 判断是否有重名的操作
+    Map<String, String> resultMap = new HashMap<>(5);
+    resultMap.put("bucketName", ossProperties.getBucketName());
+    resultMap.put("orgFileName", originalFilename);
+    resultMap.put(
+        "fileName",
+        DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN).format(LocalDateTime.now())
+            + File.separator
+            + fileName);
+    String url = String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+    resultMap.put("url", url);
+
+    try {
+      minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
+      // 文件管理数据记录,收集管理追踪文件
+      SysFile sysFile = fileLog(file, fileName, url, username);
+      resultMap.put("fileId", String.valueOf(sysFile.getId()));
+
+    } catch (Exception e) {
+      log.error("上传失败", e);
+      throw new RuntimeException(e.getLocalizedMessage());
     }
-
-
-    /**
-     * 上传文件
-     *
-     * @param file
-     * @return
-     */
-    @Override
-    public R uploadFileAllUrl(MultipartFile file) {
-//		String basePath="https://beijingc.yaoyi.net";
-        String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename());
-        Map<String, String> resultMap = new HashMap<>(4);
-        resultMap.put("bucketName", ossProperties.getBucketName());
-        resultMap.put("fileName", fileName);
-        String url = upmsConfig.getClientUrl() + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
-        resultMap.put("url", url);
-
-        try {
-            minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
-            // 文件管理数据记录,收集管理追踪文件
-            fileLog(file, fileName, url, SecurityUtils.getUser().getUsername());
-        } catch (Exception e) {
-            log.error("上传失败", e);
-            return R.failed(e.getLocalizedMessage());
-        }
-        return R.ok(resultMap);
+    return resultMap;
+  }
+
+  private MultipartFile heic2jpg(InputStream inputStream, String fileName) throws IOException {
+
+    String tempFileName =
+        LOCAL_TEMP_PATH
+            + "/img/"
+            + DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN).format(LocalDateTime.now())
+            + "/"
+            + fileName;
+
+    Thumbnails.of(inputStream).scale(1.0f).outputQuality(1.0f).toFile(tempFileName);
+
+    File tempFile = new File(tempFileName);
+    FileInputStream fileInputStream = new FileInputStream(tempFile);
+    return new MockMultipartFile(
+        tempFile.getName(), tempFile.getName(), ContentType.IMAGE_JPEG.toString(), fileInputStream);
+  }
+
+  /**
+   * 上传文件
+   *
+   * @param file
+   * @return
+   */
+  @Override
+  public R uploadFileAllUrl(MultipartFile file) {
+    //		String basePath="https://beijingc.yaoyi.net";
+    String fileName =
+        IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename());
+    Map<String, String> resultMap = new HashMap<>(4);
+    resultMap.put("bucketName", ossProperties.getBucketName());
+    resultMap.put("fileName", fileName);
+    String url =
+        upmsConfig.getClientUrl()
+            + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+    resultMap.put("url", url);
+
+    try {
+      minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
+      // 文件管理数据记录,收集管理追踪文件
+      fileLog(file, fileName, url, SecurityUtils.getUser().getUsername());
+    } catch (Exception e) {
+      log.error("上传失败", e);
+      return R.failed(e.getLocalizedMessage());
     }
-
-
-    /**
-     * 上传文件
-     *
-     * @param file
-     * @return
-     */
-    @Override
-    public R uploadFileAllUrlRealName(MultipartFile file) {
-//		String basePath="https://beijingc.yaoyi.net";
-        Date date = new Date();
-        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
-        String idStr = format.format(date);
-        String fileName = FileUtil.getName(file.getName()) + "-" + idStr + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename());
-        Map<String, String> resultMap = new HashMap<>(4);
-        resultMap.put("bucketName", ossProperties.getBucketName());
-        resultMap.put("fileName", fileName);
-        String url = upmsConfig.getClientUrl() + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
-        resultMap.put("url", url);
-
-        try {
-            minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
-            // 文件管理数据记录,收集管理追踪文件
-            fileLog(file, fileName, url, SecurityUtils.getUser().getUsername());
-        } catch (Exception e) {
-            log.error("上传失败", e);
-            return R.failed(e.getLocalizedMessage());
-        }
-        return R.ok(resultMap);
+    return R.ok(resultMap);
+  }
+
+  /**
+   * 上传文件
+   *
+   * @param file
+   * @return
+   */
+  @Override
+  public R uploadFileAllUrlRealName(MultipartFile file) {
+    //		String basePath="https://beijingc.yaoyi.net";
+    Date date = new Date();
+    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
+    String idStr = format.format(date);
+    String fileName =
+        FileUtil.getName(file.getName())
+            + "-"
+            + idStr
+            + StrUtil.DOT
+            + FileUtil.extName(file.getOriginalFilename());
+    Map<String, String> resultMap = new HashMap<>(4);
+    resultMap.put("bucketName", ossProperties.getBucketName());
+    resultMap.put("fileName", fileName);
+    String url =
+        upmsConfig.getClientUrl()
+            + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+    resultMap.put("url", url);
+
+    try {
+      minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
+      // 文件管理数据记录,收集管理追踪文件
+      fileLog(file, fileName, url, SecurityUtils.getUser().getUsername());
+    } catch (Exception e) {
+      log.error("上传失败", e);
+      return R.failed(e.getLocalizedMessage());
     }
-
-
-    /**
-     * 上传文件
-     *
-     * @return
-     */
-    @Override
-    public R uploadFileAllUrlRealName(String fileName, String suffix, FileInputStream io) {
-
-        Date date = new Date();
-        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
-        String idStr = format.format(date);
-
-        fileName = String.format("%s-%s.%s", fileName, idStr, suffix);
-
-        Map<String, String> resultMap = new HashMap<>(4);
-        resultMap.put("bucketName", ossProperties.getBucketName());
-        resultMap.put("fileName", fileName);
-        resultMap.put("url", String.format("%s/admin/sys-file/%s/%s", upmsConfig.getClientUrl(), ossProperties.getBucketName(), fileName));
-
-        try {
-            minioTemplate.putObject(ossProperties.getBucketName(), fileName, io);
-        } catch (Exception e) {
-            log.error("上传失败", e);
-            return R.failed(e.getLocalizedMessage());
-        }
-        return R.ok(resultMap);
+    return R.ok(resultMap);
+  }
+
+  /**
+   * 上传文件
+   *
+   * @return
+   */
+  @Override
+  public R uploadFileAllUrlRealName(String fileName, String suffix, FileInputStream io) {
+
+    Date date = new Date();
+    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
+    String idStr = format.format(date);
+
+    fileName = String.format("%s-%s.%s", fileName, idStr, suffix);
+
+    Map<String, String> resultMap = new HashMap<>(4);
+    resultMap.put("bucketName", ossProperties.getBucketName());
+    resultMap.put("fileName", fileName);
+    resultMap.put(
+        "url",
+        String.format(
+            "%s/admin/sys-file/%s/%s",
+            upmsConfig.getClientUrl(), ossProperties.getBucketName(), fileName));
+
+    try {
+      minioTemplate.putObject(ossProperties.getBucketName(), fileName, io);
+    } catch (Exception e) {
+      log.error("上传失败", e);
+      return R.failed(e.getLocalizedMessage());
     }
-
-    /**
-     * 读取文件
-     *
-     * @param bucket
-     * @param fileName
-     * @param response
-     */
-    @Override
-    public void getFile(String bucket, String fileName, HttpServletResponse response) {
-        try (InputStream inputStream = minioTemplate.getObject(bucket, fileName)) {
-            response.setContentType("application/octet-stream; charset=UTF-8");
-            IoUtil.copy(inputStream, response.getOutputStream());
-        } catch (Exception e) {
-            log.error("文件读取异常: {}", e.getLocalizedMessage());
-        }
+    return R.ok(resultMap);
+  }
+
+  /**
+   * 读取文件
+   *
+   * @param bucket
+   * @param fileName
+   * @param response
+   */
+  @Override
+  public void getFile(String bucket, String fileName, HttpServletResponse response) {
+    try (InputStream inputStream = minioTemplate.getObject(bucket, fileName)) {
+      response.setContentType("application/octet-stream; charset=UTF-8");
+      IoUtil.copy(inputStream, response.getOutputStream());
+    } catch (Exception e) {
+      log.error("文件读取异常: {}", e.getLocalizedMessage());
     }
-
-    /**
-     * 删除文件
-     *
-     * @param id
-     * @return
-     */
-    @Override
-    @SneakyThrows
-    @Transactional(rollbackFor = Exception.class)
-    public Boolean deleteFile(Long id) {
-        SysFile file = this.getById(id);
-        minioTemplate.removeObject(ossProperties.getBucketName(), file.getFileName());
-        return this.removeById(id);
+  }
+
+  /**
+   * 删除文件
+   *
+   * @param id
+   * @return
+   */
+  @Override
+  @SneakyThrows
+  @Transactional(rollbackFor = Exception.class)
+  public Boolean deleteFile(Long id) {
+    SysFile file = this.getById(id);
+    minioTemplate.removeObject(ossProperties.getBucketName(), file.getFileName());
+    return this.removeById(id);
+  }
+
+  /**
+   * 文件管理数据记录,收集管理追踪文件
+   *
+   * @param file 上传文件格式
+   * @param fileName 文件名
+   */
+  private SysFile fileLog(MultipartFile file, String fileName, String url, String username) {
+    SysFile sysFile = new SysFile();
+    // 原文件名
+    String original = file.getOriginalFilename();
+    sysFile.setFileName(fileName);
+    sysFile.setOriginal(original);
+    sysFile.setFileSize(file.getSize());
+    sysFile.setType(FileUtil.extName(original));
+    sysFile.setBucketName(ossProperties.getBucketName());
+    sysFile.setPath(url);
+    sysFile.setCreateUser(username);
+    this.save(sysFile);
+    return sysFile;
+  }
+
+  @Override
+  public String uploadImgByByte(InputStream inputStream) {
+    String fileName = IdUtil.simpleUUID() + StrUtil.DOT + ".jpg";
+    Map<String, String> resultMap = new HashMap<>(4);
+    resultMap.put("bucketName", ossProperties.getBucketName());
+    resultMap.put("fileName", fileName);
+    resultMap.put(
+        "url", String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName));
+
+    try {
+      minioTemplate.putObject(ossProperties.getBucketName(), fileName, inputStream);
+      // 文件管理数据记录,收集管理追踪文件
+      // fileLog(file, fileName);
+      return String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+    } catch (Exception e) {
+      log.error("上传失败", e);
     }
 
-    /**
-     * 文件管理数据记录,收集管理追踪文件
-     *
-     * @param file     上传文件格式
-     * @param fileName 文件名
-     */
-    private SysFile fileLog(MultipartFile file, String fileName, String url, String username) {
-        SysFile sysFile = new SysFile();
-        // 原文件名
-        String original = file.getOriginalFilename();
-        sysFile.setFileName(fileName);
-        sysFile.setOriginal(original);
-        sysFile.setFileSize(file.getSize());
-        sysFile.setType(FileUtil.extName(original));
-        sysFile.setBucketName(ossProperties.getBucketName());
-        sysFile.setPath(url);
-        sysFile.setCreateUser(username);
-        this.save(sysFile);
-        return sysFile;
-    }
+    return null;
+  }
 
+  @Override
+  public void getFileById(Integer fileId, HttpServletResponse response) {
+    SysFile file = this.getById(fileId);
 
-    @Override
-    public String uploadImgByByte(InputStream inputStream) {
-        String fileName = IdUtil.simpleUUID() + StrUtil.DOT + ".jpg";
-        Map<String, String> resultMap = new HashMap<>(4);
-        resultMap.put("bucketName", ossProperties.getBucketName());
-        resultMap.put("fileName", fileName);
-        resultMap.put("url", String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName));
-
-        try {
-            minioTemplate.putObject(ossProperties.getBucketName(), fileName, inputStream);
-            // 文件管理数据记录,收集管理追踪文件
-            // fileLog(file, fileName);
-            return String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
-        } catch (Exception e) {
-            log.error("上传失败", e);
-        }
-
-        return null;
-    }
-
-    @Override
-    public void getFileById(Integer fileId, HttpServletResponse response) {
-        SysFile file = this.getById(fileId);
-
-        this.getFile(file.getBucketName(), file.getFileName(), response);
-
-    }
-
+    this.getFile(file.getBucketName(), file.getFileName(), response);
+  }
 }