Parcourir la source

处理文件夹数据接口,下载数据接口

DESKTOP-2K9OVK9\siwei il y a 3 mois
Parent
commit
059b75c4f5

+ 86 - 3
onemap-modules/onemap-file/src/main/java/com/onemap/file/controller/SysFileController.java

@@ -1,15 +1,23 @@
 package com.onemap.file.controller;
 
-import com.alibaba.fastjson.JSONObject;
 import com.onemap.common.core.domain.UploadZipDTO;
+import com.onemap.common.core.utils.StringUtils;
 import com.onemap.common.core.web.controller.BaseController;
 import com.onemap.common.core.web.domain.RequestResult;
-import com.onemap.file.domain.ShpFileDTO;
+import com.onemap.common.redis.service.RedisService;
 import com.onemap.file.domain.TSpotFileDto;
+import com.onemap.file.utils.FixedThreadUtil;
 import com.onemap.system.api.domain.GhtgCl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.AntPathMatcher;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import com.onemap.common.core.domain.R;
@@ -17,11 +25,22 @@ import com.onemap.common.core.utils.file.FileUtils;
 import com.onemap.file.service.ISysFileService;
 import com.onemap.system.api.domain.SysFile;
 import com.onemap.system.api.RemoteApplyService;
+import org.springframework.web.servlet.HandlerMapping;
 
-import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 文件请求处理
@@ -36,6 +55,8 @@ public class SysFileController extends BaseController {
     private ISysFileService sysFileService;
     @Autowired
     private RemoteApplyService applyService;
+    @Autowired
+    private RedisService redisService;
 
     /**
      * 文件上传
@@ -251,4 +272,66 @@ public class SysFileController extends BaseController {
             return null;
         }
     }
+
+    @GetMapping("/getReadFolder")
+    public RequestResult getReadFolder(String folder) {
+        if (StringUtils.isEmpty(folder)) {
+            return RequestResult.error("folder is null");
+        }
+        File file = new File(folder);
+        if (!file.exists() || !file.isDirectory()) {
+            return RequestResult.error("folder is not exist");
+        }
+        FixedThreadUtil.FIXED_THREAD_POOL.execute(() -> {
+            sysFileService.getReadFolder(file);
+        });
+        return RequestResult.success("执行成功,文件数量为:" + Objects.requireNonNull(file.listFiles()).length);
+    }
+
+    /**
+     * 文件下载
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @GetMapping("/spot/download/shp/file/{id}/{uploadId}")
+    public ResponseEntity<Resource> uploadAttachment(@PathVariable("id") String id, @PathVariable("uploadId") String uploadId, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String upload_id = "upliad_" + id + "_" + uploadId;
+            String uploadFile = redisService.getCacheObject(upload_id);
+            if (StringUtils.isEmpty(uploadFile)) {
+                return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+            }
+            // 构建文件的完整路径
+            Path filePath = Paths.get(uploadFile);
+            File file = filePath.toFile();
+            Resource resource = new FileSystemResource(file);
+            // 如果资源不存在,返回404
+            if (!resource.exists()) {
+                return ResponseEntity.notFound().build();
+            }
+            // 获取文件MIME类型
+            String contentType = Files.probeContentType(filePath);
+            if (contentType == null) {
+                // 如果无法确定MIME类型,则使用默认值
+                contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
+            }
+            String d0_name = file.getName();
+            String d1_name = URLEncoder.encode(d0_name, "UTF-8");
+            // 设置HTTP头部信息
+            HttpHeaders headers = new HttpHeaders();
+            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + d1_name);
+            headers.setContentType(MediaType.parseMediaType(contentType));
+//            headers.setAccessControlAllowOrigin("*");
+            // 返回文件资源
+            return ResponseEntity.ok().headers(headers).contentLength(Files.size(filePath))  // 可选:设置内容长度
+                    .body(resource);
+        } catch (Exception e) {
+            // 处理IO异常,例如文件不存在或无法读取
+//            e.printStackTrace();
+            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        }
+    }
+
 }

+ 59 - 0
onemap-modules/onemap-file/src/main/java/com/onemap/file/domain/CustomMultipartFile.java

@@ -0,0 +1,59 @@
+package com.onemap.file.domain;
+
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.util.FileCopyUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class CustomMultipartFile implements MultipartFile {
+
+    private final File file;
+
+    public CustomMultipartFile(File file) {
+        this.file = file;
+    }
+
+    @Override
+    public String getName() {
+        return file.getName();
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return file.getName();
+    }
+
+    @Override
+    public String getContentType() {
+        // 可以根据文件扩展名设置 MIME 类型
+        return "application/octet-stream";
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return file.length() == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return file.length();
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return FileCopyUtils.copyToByteArray(file);
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new FileInputStream(file);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        FileCopyUtils.copy(file, dest);
+    }
+}

+ 6 - 0
onemap-modules/onemap-file/src/main/java/com/onemap/file/service/ISysFileService.java

@@ -6,6 +6,8 @@ import com.onemap.system.api.domain.GhtgCl;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+
 /**
  * 文件上传接口
  *
@@ -51,4 +53,8 @@ public interface ISysFileService {
     RequestResult spotfileList(String uploaduser);
 
     RequestResult spotfileDelete(String id);
+
+    int getReadFolder(File folder);
+
+
 }

+ 47 - 0
onemap-modules/onemap-file/src/main/java/com/onemap/file/service/LocalSysFileServiceImpl.java

@@ -6,16 +6,20 @@ import com.google.common.collect.ImmutableMap;
 import com.onemap.common.core.domain.TgclTypeDTO;
 import com.onemap.common.core.domain.UploadZipDTO;
 import com.onemap.common.core.domain.WordToPdfDTO;
+import com.onemap.common.core.exception.ServiceException;
 import com.onemap.common.core.utils.StringUtils;
 import com.onemap.common.core.web.domain.RequestResult;
 import com.onemap.common.security.utils.SecurityUtils;
+import com.onemap.file.domain.CustomMultipartFile;
 import com.onemap.file.domain.ShpFileDTO;
 import com.onemap.file.domain.TSpotFileDto;
 import com.onemap.file.domain.ZhxzFileDTO;
 import com.onemap.file.mapper.SpotFileMapper;
 import com.onemap.file.mapper.ZhxzFileMapper;
 import com.onemap.file.utils.*;
+import com.onemap.system.api.RemoteApplyService;
 import com.onemap.system.api.domain.GhtgCl;
+import com.onemap.system.api.model.LoginUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
@@ -29,6 +33,7 @@ import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.List;
 import java.util.Map;
 
@@ -80,6 +85,9 @@ public class LocalSysFileServiceImpl implements ISysFileService {
      */
     @Value("${businessType.shp}")
     private String shpLocalFilePath;
+    @Autowired
+    private RemoteApplyService applyService;
+
     //文件上传后的转发路径配置
     private Map<String, String> businessFilter = ImmutableMap.of("tgcl", "调规");
 
@@ -520,4 +528,43 @@ public class LocalSysFileServiceImpl implements ISysFileService {
         }
         return null;
     }
+
+    @Override
+    public int getReadFolder(File folder) {
+        File localFile = new File(localFilePath);
+        String localFileStr = localFile.getAbsolutePath();
+        String folderFileStr = folder.getAbsolutePath();
+        System.out.println("localFileStr:" + localFileStr);
+        System.out.println("folderFileStr:" + folderFileStr);
+        if (localFileStr.indexOf(folderFileStr) == 0) {
+            System.out.println("folderFileStr 与本地路径相同,将暂停执行");
+            return 0;
+        }
+        if (folderFileStr.indexOf(localFileStr) == 0) {
+            System.out.println("folderFileStr 与本地路径相同,将暂停执行");
+            return 0;
+        }
+        File[] tbList = folder.listFiles();
+        for (File f : tbList) {
+            try {
+                System.out.println(f.getName());
+                MultipartFile multipartFile = new CustomMultipartFile(f);
+                RequestResult res = uploadSpotZip(multipartFile, SecurityUtils.getUsername());
+                if (res.isSuccess()) {
+                    TSpotFileDto dto = (TSpotFileDto) res.get("data");
+                    applyService.supervisehandle(dto.getId());
+                }
+            } catch (Exception e) {
+                System.out.println(e.getMessage());
+            } finally {
+                try {
+                    Files.delete(f.toPath());
+                } catch (IOException ex) {
+                    System.out.println(ex.getMessage());
+                }
+            }
+        }
+        return 1;
+    }
+
 }

+ 43 - 0
onemap-modules/onemap-file/src/main/java/com/onemap/file/utils/FixedThreadUtil.java

@@ -0,0 +1,43 @@
+package com.onemap.file.utils;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 异步线程池
+ *
+ * @author GW00229833
+ **/
+public class FixedThreadUtil {
+
+    private FixedThreadUtil() {
+
+    }
+
+
+    /**
+     * 线程数
+     */
+    private static final int N_CPUS = Runtime.getRuntime().availableProcessors();
+    /**
+     * 使用 ThreadFactoryBuilder 创建自定义线程名称的 ThreadFactory
+     */
+    private static final ThreadFactory NAMED_THREAD_FACTORY = new ThreadFactoryBuilder()
+            .setNameFormat("hyn-demo-pool-%d").build();
+    /**
+     * 创建线程池,其中任务队列需要结合实际情况设置合理的容量  消费大数据kafka
+     */
+    public static final ThreadPoolExecutor FIXED_THREAD_POOL = new ThreadPoolExecutor(N_CPUS,
+            N_CPUS * 2,
+            0L,
+            TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<>(10240),
+            NAMED_THREAD_FACTORY,
+            new ThreadPoolExecutor.CallerRunsPolicy());
+
+
+}