浏览代码

解压图片数据集+上传对应excel文件

WangRuiLin 1 年之前
父节点
当前提交
67ae283125

+ 13 - 0
pom.xml

@@ -348,6 +348,19 @@
                 <artifactId>transmittable-thread-local</artifactId>
                 <version>${alibaba-ttl.version}</version>
             </dependency>
+            <!--            解压-->
+            <dependency>
+                <groupId>com.github.junrar</groupId>
+                <artifactId>junrar</artifactId>
+                <version>7.4.1</version>
+            </dependency>
+
+            <dependency>
+                <groupId>net.lingala</groupId>
+                <artifactId>zip4j</artifactId>
+                <version>1.3.3</version>
+            </dependency>
+
 
             <!--短信sms4j-->
             <!--            <dependency>-->

+ 1 - 2
script/sql/postgresql/data(postgresql).sql

@@ -23,8 +23,7 @@ CREATE TABLE IF NOT EXISTS public.data
 
     TABLESPACE pg_default;
 
-ALTER TABLE IF EXISTS public.data
-    OWNER to "86187";
+
 
 COMMENT ON TABLE public.data
     IS '数据管理表';

+ 8 - 0
taais-admin/pom.xml

@@ -71,6 +71,14 @@
             <groupId>de.codecentric</groupId>
             <artifactId>spring-boot-admin-starter-client</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.taais</groupId>
+            <artifactId>taais-demo</artifactId>
+        </dependency>
 
         <!--  powerjob 客户端  -->
         <!--        <dependency>-->

+ 189 - 14
taais-admin/src/main/java/com/taais/web/controller/common/CommonController.java

@@ -1,31 +1,45 @@
 package com.taais.web.controller.common;
 
+import cn.hutool.core.convert.Convert;
 import com.taais.common.core.config.TaaisConfig;
 import com.taais.common.core.constant.Constants;
 import com.taais.common.core.core.domain.CommonResult;
+import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.core.utils.StringUtils;
 import com.taais.common.core.utils.file.FileUploadUtils;
 import com.taais.common.core.utils.file.FileUtils;
+import com.taais.common.core.utils.file.UnPackedUtil;
+import com.taais.common.excel.utils.ExcelUtil;
+import com.taais.demo.domain.Data;
+import com.taais.demo.domain.vo.DataVo;
+import com.taais.demo.service.IDataService;
 import com.taais.system.config.ServerConfig;
 import com.taais.system.domain.vo.SysOssUploadVo;
 import com.taais.system.domain.vo.SysOssVo;
 import com.taais.system.service.ISysOssService;
+import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+
+import net.lingala.zip4j.model.FileHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import static com.taais.common.security.utils.LoginHelper.getLoginUser;
+
 
 /**
  * 通用请求处理
@@ -41,6 +55,9 @@ public class CommonController {
     private ServerConfig serverConfig;
     private final ISysOssService sysOssService;
 
+    @Autowired
+    private IDataService dataService;
+
     public CommonController(ISysOssService sysOssService) {
         this.sysOssService = sysOssService;
     }
@@ -76,18 +93,19 @@ public class CommonController {
     @PostMapping("/upload")
     public CommonResult<SysOssUploadVo> uploadFile(MultipartFile file) throws Exception {
         try {
-
             // 上传文件路径
             String filePath = TaaisConfig.getUploadPath();
+
             // 上传并返回新文件名称
+
             String fileName = FileUploadUtils.upload(filePath, file);
             String url = serverConfig.getUrl() + fileName;
             String  originalFilename = file.getOriginalFilename();
-            Map<String, Object> map = new HashMap<>();
-            map.put("url", url);
-            map.put("fileName", fileName);
-            map.put("newFileName", FileUtils.getName(fileName));
-            map.put("originalFilename", originalFilename);
+//            Map<String, Object> map = new HashMap<>();
+//            map.put("url", url);
+//            map.put("fileName", fileName);
+//            map.put("newFileName", FileUtils.getName(fileName));
+//            map.put("originalFilename", originalFilename);
             assert originalFilename != null;
             String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
             // 信息保存在文件管理
@@ -102,6 +120,105 @@ public class CommonController {
         }
     }
 
+    @PostMapping("/zip/upload")
+    public CommonResult<SysOssUploadVo> uploadZipFile(@RequestParam("file") MultipartFile file, @RequestParam("excelFile") MultipartFile excelFile) throws Exception {
+//        try {
+
+
+            List<DataVo> userList = ExcelUtil.importExcel(excelFile.getInputStream(),DataVo.class);
+            Map<String, Data> pic_name2obj = new HashMap<>();
+            //为插入数据库做准备
+            for(DataVo dataVo:userList){
+                pic_name2obj.put(dataVo.getName(), MapstructUtils.convert(dataVo, Data.class));
+            }
+            String  originalFilename = file.getOriginalFilename();
+            assert originalFilename != null;
+            String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
+
+
+            // 解压
+            String basedir = TaaisConfig.getUploadPath();
+            File ZipOrRar_temp = FileUploadUtils.getAbsoluteFile(basedir,FileUploadUtils.extractFilename(file));// 解压目录
+            String dest_zip = ZipOrRar_temp.getAbsolutePath();
+
+            file.transferTo(Paths.get(dest_zip));
+            String dest = ZipOrRar_temp.getParent();
+
+            List<File> extractedFileList = new ArrayList<File>();
+            if(suffix.equals(".zip")){
+                List<FileHeader> fileheaders = UnPackedUtil.unPackZip(ZipOrRar_temp,dest);
+                //解压后的目录
+                String dir_name = fileheaders.get(0).getFileName();
+                dest = dest + '/' + dir_name.substring(0,dir_name.length()-1);
+                for(FileHeader fileHeader : fileheaders) {
+
+                    if (!fileHeader.isDirectory()) {
+                        String fileHeaderName = fileHeader.getFileName();
+                        String fileHeader_suffix = StringUtils.substring(fileHeaderName, fileHeaderName.lastIndexOf("."), fileHeaderName.length());
+                        if(!fileHeader_suffix.equals(".jpg")&&!fileHeader_suffix.equals(".jpeg")
+                            &&!fileHeader_suffix.equals(".png")){
+                            continue;
+
+//                            for(File efile:extractedFileList){
+//                                efile.delete();
+//
+//                            }
+//                            return CommonResult.fail("压缩文件里有文件并不是图片!");
+                        }
+                        extractedFileList.add(new File(dest,fileHeader.getFileName()));
+                    }
+                }
+
+
+
+            }else if(suffix.equals(".rar")){
+                List<com.github.junrar.rarfile.FileHeader> fileheaders = UnPackedUtil.unPackRar(ZipOrRar_temp,dest);
+
+                //解压后的目录
+                String dir_name = fileheaders.get(0).getFileName();
+                dest = dest + '/' + dir_name.substring(0,dir_name.length()-1);
+                for(com.github.junrar.rarfile.FileHeader fileHeader : fileheaders) {
+
+                    if (!fileHeader.isDirectory()) {
+                        String fileHeaderName = fileHeader.getFileName();
+                        String fileHeader_suffix = StringUtils.substring(fileHeaderName, fileHeaderName.lastIndexOf("."), fileHeaderName.length());
+                        if(!fileHeader_suffix.equals(".jpg")&&!fileHeader_suffix.equals(".jpeg")
+                            &&!fileHeader_suffix.equals(".png")){
+                            continue;
+
+//                            for(File efile:extractedFileList){
+//                                efile.delete();
+//
+//                            }
+//                            return CommonResult.fail("压缩文件里有文件并不是图片!");
+                        }
+                        extractedFileList.add(new File(dest,fileHeader.getFileName()));
+                    }
+                }
+
+
+            }
+
+            for(File efile:extractedFileList){
+                String fileName = FileUploadUtils.getPathFileName(dest,efile.getName());
+                String url = serverConfig.getUrl() + fileName;
+                url = url.replaceAll("\\\\", "/");
+                Data mydata = pic_name2obj.get(efile.getName());
+
+                // TODO: 将导入的excel表和url一起插入数据库,图片名称对应
+                mydata.setUrl(url);
+                dataService.save(mydata);
+            }
+            //删除压缩文件
+            FileUtils.deleteFile(dest_zip);
+
+
+            return CommonResult.success("数据集上传成功!");
+//        } catch (Exception e) {
+//            return CommonResult.fail(e.getMessage());
+//        }
+    }
+
     /**
      * 通用上传请求(多个)
      */
@@ -157,4 +274,62 @@ public class CommonController {
             log.error("下载文件失败", e);
         }
     }
+
+    /**
+     * 文件打包下载
+     * @param response
+     * @param files
+     */
+    @GetMapping ("/zip")
+    public void downloadZip(HttpServletResponse response, String files){
+        //下载压缩文件的名称
+        String zipname= getLoginUser().getUsername();
+
+        String[] filesPaths = Convert.toStrArray(files);
+
+        String fileName = zipname + ".zip";
+        response.setContentType("application/zip");
+        response.setHeader("content-disposition", "attachment;filename=" + fileName);
+
+        ZipOutputStream zos = null;
+        BufferedInputStream bis = null;
+        try{
+            zos = new ZipOutputStream(response.getOutputStream());
+            byte[] buf = new byte[8192];
+            int len;
+            for (int i = 0; i < filesPaths.length; i++) {
+                File file = new File(filesPaths[i]);
+                if (!file.isFile()) {
+                    continue;
+                }
+                ZipEntry ze = new ZipEntry(file.getName());
+                zos.putNextEntry(ze);
+                bis = new BufferedInputStream(new FileInputStream(file));
+                while ((len = bis.read(buf)) > 0) {
+                    zos.write(buf, 0, len);
+                }
+                zos.closeEntry();
+            }
+            zos.closeEntry();
+        }catch(Exception ex){
+            ex.printStackTrace();
+        }finally {
+            if(bis != null){
+                try{
+                    bis.close();
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+            if(zos != null){
+                try{
+                    zos.close();
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
 }

+ 10 - 0
taais-common/taais-common-core/pom.xml

@@ -149,6 +149,16 @@
             <artifactId>mybatis-flex-spring-boot3-starter</artifactId>
         </dependency>
 
+        <!--            解压-->
+        <dependency>
+            <groupId>com.github.junrar</groupId>
+            <artifactId>junrar</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>net.lingala</groupId>
+            <artifactId>zip4j</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 8 - 1
taais-common/taais-common-core/src/main/java/com/taais/common/core/config/TaaisConfig.java

@@ -1,5 +1,6 @@
 package com.taais.common.core.config;
 
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
@@ -9,12 +10,14 @@ import org.springframework.stereotype.Component;
  * @author wgk
  */
 @Component
-@ConfigurationProperties(prefix = "km")
+//@ConfigurationProperties(prefix = "km")
+@ConfigurationProperties(prefix = "taais")
 public class TaaisConfig {
 
     /**
      * 文件路径
      */
+
     private static String profile;
     /**
      * 获取地址开关
@@ -37,10 +40,13 @@ public class TaaisConfig {
      */
     private boolean demoEnabled;
 
+
     public static String getProfile() {
+
         return profile;
     }
 
+//    @Value("${taais.profile}")
     public void setProfile(String profile) {
         TaaisConfig.profile = profile;
     }
@@ -81,6 +87,7 @@ public class TaaisConfig {
         return getProfile() + "/upload";
     }
 
+
     public String getName() {
         return name;
     }

+ 1 - 0
taais-common/taais-common-core/src/main/java/com/taais/common/core/constant/Constants.java

@@ -84,6 +84,7 @@ public class Constants {
     /**
      * 资源映射路径 前缀
      */
+
     public static final String RESOURCE_PREFIX = "/profile";
 
 

+ 1 - 0
taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/FileUploadUtils.java

@@ -102,6 +102,7 @@ public class FileUploadUtils {
 
         String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
         file.transferTo(Paths.get(absPath));
+
         return getPathFileName(baseDir, fileName);
     }
 

+ 1 - 0
taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/FileUtils.java

@@ -106,6 +106,7 @@ public class FileUtils extends FileUtil {
         // 路径为文件且不为空则进行删除
         if (file.isFile() && file.exists()) {
             flag = file.delete();
+
         }
         return flag;
     }

+ 132 - 0
taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/UnPackedUtil.java

@@ -0,0 +1,132 @@
+package com.taais.common.core.utils.file;
+import com.github.junrar.Archive;
+import com.github.junrar.rarfile.FileHeader;
+import net.lingala.zip4j.core.ZipFile;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class UnPackedUtil {
+    private static final Logger logger = LoggerFactory.getLogger(UnPackedUtil.class);
+
+    /**
+     * zip文件解压
+     *
+     * @param destPath 解压文件路径
+     * @param zipFile  压缩文件
+     */
+    public static List<net.lingala.zip4j.model.FileHeader> unPackZip(File zipFile, String destPath) {
+        List<net.lingala.zip4j.model.FileHeader> fileHeaders = new ArrayList<>();
+        try {
+
+            ZipFile zip = new ZipFile(zipFile);
+            /*zip4j默认用GBK编码去解压,这里设置编码为GBK的*/
+            zip.setFileNameCharset("GBK");
+            logger.info("begin unpack zip file....");
+            zip.extractAll(destPath);
+            fileHeaders = zip.getFileHeaders();
+
+        } catch (Exception e) {
+
+            logger.error("解压失败:", e.getMessage(), e);
+
+        }
+        return fileHeaders;
+    }
+
+    /**
+     * rar文件解压(不支持有密码的压缩包)
+     *
+     * @param rarFile  rar压缩包
+     * @param destPath 解压保存路径
+     */
+    public static List<FileHeader> unPackRar(File rarFile, String destPath) {
+        List<FileHeader> fileHeaders = new ArrayList<>();
+        try (Archive archive = new Archive(rarFile)) {
+            if (null != archive) {
+                FileHeader fileHeader = archive.nextFileHeader();
+                File file = null;
+                while (null != fileHeader) {
+                    fileHeaders.add(fileHeader);
+                    // 防止文件名中文乱码问题的处理
+                    String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();
+                    if (fileHeader.isDirectory()) {
+                        //是文件夹
+                        file = new File(destPath + File.separator + fileName);
+                        file.mkdirs();
+                    } else {
+                        //不是文件夹
+                        file = new File(destPath + File.separator + fileName.trim());
+                        if (!file.exists()) {
+                            if (!file.getParentFile().exists()) {
+                                // 相对路径可能多级,可能需要创建父目录.
+                                file.getParentFile().mkdirs();
+                            }
+                            file.createNewFile();
+                        }
+                        FileOutputStream os = new FileOutputStream(file);
+                        archive.extractFile(fileHeader, os);
+                        os.close();
+                    }
+                    fileHeader = archive.nextFileHeader();
+                }
+            }
+        } catch (Exception e) {
+            logger.error("解压失败:", e.getMessage(), e);
+        }
+
+        return fileHeaders;
+    }
+
+    // MultipartFile 转 File
+    private static File multipartFileToFile(MultipartFile multipartFile) {
+        File file = null;
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            file = new File(multipartFile.getOriginalFilename());
+            outputStream = new FileOutputStream(file);
+            write(inputStream, outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return file;
+    }
+
+    public static void write(InputStream inputStream, OutputStream outputStream) {
+        byte[] buffer = new byte[4096];
+        try {
+            int count = inputStream.read(buffer, 0, buffer.length);
+            while (count != -1) {
+                outputStream.write(buffer, 0, count);
+                count = inputStream.read(buffer, 0, buffer.length);
+            }
+        } catch (RuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+
+}

+ 7 - 0
taais-mydemo/src/main/java/com/taais/demo/controller/DataController.java

@@ -1,5 +1,6 @@
 package com.taais.demo.controller;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import com.mybatisflex.core.query.QueryWrapper;
@@ -42,6 +43,7 @@ public class DataController extends BaseController {
     @SaCheckPermission("demo:data:list")
     @GetMapping("/list")
     public CommonResult<PageResult<DataVo>> list(DataBo dataBo) {
+
         return CommonResult.success(dataService.selectPage(dataBo));
 
     }
@@ -110,4 +112,9 @@ public class DataController extends BaseController {
         }
         return CommonResult.success();
     }
+
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response) {
+        ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", DataVo.class, response);
+    }
 }

+ 1 - 1
taais-mydemo/src/main/java/com/taais/demo/domain/vo/DataVo.java

@@ -31,7 +31,7 @@ public class DataVo  implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /** id */
-    @ExcelProperty(value = "id")
+//    @ExcelProperty(value = "id")
     private Long id;
 
     /** 名称 */

+ 1 - 1
taais-mydemo/src/main/java/com/taais/demo/service/impl/DataServiceImpl.java

@@ -113,7 +113,7 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
      */
     @Override
     public boolean insert(DataBo dataBo) {
-    Data data =MapstructUtils.convert(dataBo, Data.class);
+        Data data = MapstructUtils.convert(dataBo, Data.class);
 
         return this.save(data);//使用全局配置的雪花算法主键生成器生成ID值
     }