lin.liu 1 ヶ月 前
コミット
8d053f8eaf

+ 27 - 2
secure-producting-common/src/main/java/com/customs/cq/datacenter/common/utils/file/FileUtils.java

@@ -238,7 +238,7 @@ public class FileUtils extends FileUtil {
         if (StringUtil.isNullOrEmpty(fileName)) {
             return "";
         }
-        String[] arrayPath = StringUtil.split(fileName, "/");
+        String[] arrayPath = StringUtil.split(fileName.toLowerCase(), "/");
         String realFileName = arrayPath[arrayPath.length - 1];
         String[] array = StringUtil.split(realFileName, "\\.");
         String fileSuffix = "." + array[array.length - 1];
@@ -315,7 +315,7 @@ public class FileUtils extends FileUtil {
         String result;
         switch (fileSuffix) {
             case ".zip":
-                result = "application/zip";
+                result = "application/x-zip-compressed";
                 break;
             case ".rar":
                 result = "application/x-rar";
@@ -346,6 +346,31 @@ public class FileUtils extends FileUtil {
             case ".txt":
                 result = "text/plain";
                 break;
+            default:
+                result = getAudioVideoMediaType4FileName(fileSuffix);
+                break;
+        }
+        return result;
+    }
+
+    private static String getAudioVideoMediaType4FileName(String fileSuffix) {
+        String result;
+        switch (fileSuffix) {
+            case ".mp2":
+                result = "video/mpeg";
+                break;
+            case ".mp3":
+                result = "audio/mpeg";
+                break;
+            case ".flac":
+                result = "audio/x-flac";
+            case ".flv":
+                result = "video/x-flv";
+            case ".3gp":
+                result = "video/3gpp";
+            case ".mp4":
+                result = "video/mp4";
+                break;
             default:
                 result = "";
                 break;

+ 316 - 1
secure-producting-host/src/main/java/com/customs/cq/datacenter/host/web/controller/system/FileController.java

@@ -21,8 +21,10 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.nio.charset.StandardCharsets;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -125,7 +127,156 @@ public class FileController {
         filePath += "/" + LocalDateTimeUtil.toFormatString(LocalDateTimeUtil.todayFirst(), "yyyyMMdd") + "/";
         InputStream fsIn = file.getInputStream();
 
-        String fileSuffix = FileUtils.getFileExtByType(file.getContentType());
+        String fileSuffix = FileUtils.getFileExtByType(type.getValue());
+        File directory = new File(SystemConfig.UPLOAD_FILE.getUploadBasicPath() + filePath);
+        //如果路径不存在,新建
+        if (!directory.exists() && !directory.isDirectory()) {
+            directory.mkdirs();
+        }
+
+        // 构建新文件名
+        String newFileName = filePath + MD5Util.encrypt(file.getOriginalFilename() + LocalDateTimeUtil.nowDateTimeFullStr() + SystemConfig.UPLOAD_FILE.getDisturbStr()) + fileSuffix;
+        File newFile = new File(SystemConfig.UPLOAD_FILE.getUploadBasicPath() + newFileName);
+        if (!newFile.exists()) {
+            //每次写入1MB
+            byte[] buffer = new byte[Constants.FILE_UNIT * Constants.FILE_SIZE_1M];
+            int len;
+            FileOutputStream fsOut = null;
+            try {
+                fsOut = new FileOutputStream(newFile);
+                while ((len = fsIn.read(buffer)) != -1) {
+                    fsOut.write(buffer, 0, len);
+                    fsOut.flush();
+                }
+            } finally {
+                if (Objects.nonNull(fsOut)) {
+                    fsOut.close();
+                }
+            }
+        }
+        fsIn.close();
+
+        String newPdfFileName = newFileName.substring(0, newFileName.indexOf(".")) + ".pdf";
+        String newPdfFilePath = SystemConfig.UPLOAD_FILE.getUploadBasicPath() + newPdfFileName;
+        // 处理office文档
+        switch (type) {
+            case WORD:
+            case WORDX:
+                OfficeFileUtil.wordToPdf(newFile.getPath(), newPdfFilePath);
+                break;
+            case EXCEL:
+            case EXCELX:
+                OfficeFileUtil.excelToPdf(newFile.getPath(), newPdfFilePath);
+                break;
+            case PPT:
+            case PPTX:
+                OfficeFileUtil.pptToPdf(newFile.getPath(), newPdfFilePath);
+                break;
+        }
+
+        // 返回上传结果信息
+//        result.setFileId(fileId);
+        result.setFileId(LocalDateTimeUtil.nowTimeStampStr());
+        result.setName(file.getOriginalFilename());
+        result.setNewFileName(newFileName);
+        result.setNewPdfFileName("");
+        result.setSize(size);
+        result.setFileType(type.name().toLowerCase());
+        result.setContentType(type.getValue());
+        result.setNewFileView(SystemConfig.UPLOAD_FILE.getFileBasicUrl() + "?path=" + java.net.URLEncoder.encode(newFileName, "UTF-8"));
+
+        if (new File(newPdfFilePath).exists()) {
+            result.setNewPdfFileName(newPdfFileName);
+
+        }
+
+        file = null;
+        newFile = null;
+
+        return ExecutedResult.success(result);
+    }
+
+    @SaIgnore
+    @PostMapping(value = "upload2")
+    public ExecutedResult<UploadResultDto> upload2(MultipartHttpServletRequest requestMultipart) throws Exception {
+        UploadResultDto result = this.defaultResult();
+
+        Map<String, MultipartFile> mapFile = requestMultipart.getFileMap();
+        if (mapFile.isEmpty()) {
+            return ExecutedResult.failed("请求中没有找到文件。");
+        }
+        if (mapFile.size() > 1) {
+            return ExecutedResult.failed("仅支持单个文件上传。");
+        }
+//        String fileId = requestMultipart.getParameter("fileId");
+//        if (StringUtil.isNullOrEmpty(fileId)) {
+//            return ExecutedResult.failed(ParameterUtil.named("文件id") + EParameterValidateType.NOT_NULLOREMPTY.getDesc());
+//        }
+        Iterator<Map.Entry<String, MultipartFile>> iterator = mapFile.entrySet().iterator();
+        Map.Entry<String, MultipartFile> fileEntry = iterator.next();
+
+        MultipartFile file = fileEntry.getValue();
+        String contentType = file.getContentType();
+
+        // 动态限制文件上传支持的类型
+//        InputStream fConfig = resourceLoader.getResource("classpath:upload_allow.json").getInputStream();
+//        String allowStr = FileUtils.readFileContent(fConfig);
+//        Map<String, String> map = new Gson().fromJson(allowStr, Map.class);
+//        List<NameValueDto> listConfig = map.entrySet().stream().map(c -> new NameValueDto(c.getKey(), c.getValue()))
+//                .collect(Collectors.toList());
+//        NameValueDto findConfig = listConfig.stream().filter(c -> c.getName().equalsIgnoreCase(contentType))
+//                .findAny().orElse(null);
+//        if (Objects.isNull(findConfig)) {
+//            return ExecutedResult.failed(file.getOriginalFilename() + ", 不支持的文件类型。" + file.getContentType());
+//        }
+//        if (null != file.getOriginalFilename() && !file.getOriginalFilename().toLowerCase().contains(findConfig.getValue())) {
+//            return ExecutedResult.failed(file.getOriginalFilename() + ", 不支持的文件类型。" + file.getContentType());
+//        }
+
+        String filePath = "/files";
+        EContentType type = EContentType.getByValue(FileUtils.getMediaTypeByFileName(file.getOriginalFilename()));
+        long size = file.getSize() / Constants.FILE_UNIT;
+        // 限制文件上传大小
+        switch (type) {
+            case GIF:
+            case JPG:
+            case PNG:
+            case JPEG:
+            case BMP:
+                filePath = "/images";
+                if (size > Constants.FILE_SIZE_20M) {
+                    return ExecutedResult.failed("图片不能超过20M!");
+                }
+                break;
+            case GZ:
+            case RAR:
+            case X7Z:
+            case ZIP:
+            case TEXT:
+            case PDF:
+            case PPT:
+            case PPTX:
+            case WORD:
+            case WORDX:
+            case EXCEL:
+            case EXCELX:
+            case MP3:
+                if (size > Constants.FILE_SIZE_50M) {
+                    return ExecutedResult.failed("文件不能超过50M!");
+                }
+                break;
+            case MP4:
+                if (size > Constants.FILE_SIZE_200M) {
+                    return ExecutedResult.failed("视频文件不能超过200M!");
+                }
+                break;
+            default:
+                break;
+        }
+        filePath += "/" + LocalDateTimeUtil.toFormatString(LocalDateTimeUtil.todayFirst(), "yyyyMMdd") + "/";
+        InputStream fsIn = file.getInputStream();
+
+        String fileSuffix = FileUtils.getFileExtByType(type.getValue());
         File directory = new File(SystemConfig.UPLOAD_FILE.getUploadBasicPath() + filePath);
         //如果路径不存在,新建
         if (!directory.exists() && !directory.isDirectory()) {
@@ -356,4 +507,168 @@ public class FileController {
         result.setSize(0L);
         return result;
     }
+
+    /**
+     * 上传文件(断点续传)
+     *
+     * @param requestMultipart servlet复杂请求对象
+     * @author lin.liu
+     */
+    @SaIgnore
+    @PostMapping(value = "uploadV2")
+    public ExecutedResult<UploadResultDto> uploadV2(MultipartHttpServletRequest requestMultipart, HttpServletRequest request) throws Exception {
+        UploadResultDto result = this.defaultResult();
+
+        Map<String, MultipartFile> mapFile = requestMultipart.getFileMap();
+        if (mapFile.isEmpty()) {
+            return ExecutedResult.failed("请求中没有找到文件。");
+        }
+        if (mapFile.size() > 1) {
+            return ExecutedResult.failed("仅支持单个文件上传。");
+        }
+//        String fileId = requestMultipart.getParameter("fileId");
+//        if (StringUtil.isNullOrEmpty(fileId)) {
+//            return ExecutedResult.failed(ParameterUtil.named("文件id") + EParameterValidateType.NOT_NULLOREMPTY.getDesc());
+//        }
+        Iterator<Map.Entry<String, MultipartFile>> iterator = mapFile.entrySet().iterator();
+        Map.Entry<String, MultipartFile> fileEntry = iterator.next();
+
+        MultipartFile file = fileEntry.getValue();
+        String contentType = file.getContentType();
+        String range = request.getParameter("HGRange");
+        String fileName = request.getParameter("HGFileName");
+        int fileSize = Integer.parseInt(request.getParameter("HGFileSize"));
+
+        // 动态限制文件上传支持的类型
+//        InputStream fConfig = resourceLoader.getResource("classpath:upload_allow.json").getInputStream();
+//        String allowStr = FileUtils.readFileContent(fConfig);
+//        Map<String, String> map = new Gson().fromJson(allowStr, Map.class);
+//        List<NameValueDto> listConfig = map.entrySet().stream().map(c -> new NameValueDto(c.getKey(), c.getValue()))
+//                .collect(Collectors.toList());
+//        NameValueDto findConfig = listConfig.stream().filter(c -> c.getName().equalsIgnoreCase(contentType))
+//                .findAny().orElse(null);
+//        if (Objects.isNull(findConfig)) {
+//            return ExecutedResult.failed(file.getOriginalFilename() + ", 不支持的文件类型。" + file.getContentType());
+//        }
+//        if (null != file.getOriginalFilename() && !file.getOriginalFilename().toLowerCase().contains(findConfig.getValue())) {
+//            return ExecutedResult.failed(file.getOriginalFilename() + ", 不支持的文件类型。" + file.getContentType());
+//        }
+
+        String filePath = "/files";
+        EContentType type = EContentType.getByValue(FileUtils.getMediaTypeByFileName(fileName));
+        long size = file.getSize() / Constants.FILE_UNIT;
+        // 限制文件上传大小
+        switch (type) {
+            case GIF:
+            case JPG:
+            case PNG:
+            case JPEG:
+            case BMP:
+                filePath = "/images";
+                break;
+            default:
+                break;
+        }
+        filePath += "/uploadV2/";
+        InputStream fsIn = file.getInputStream();
+
+        String fileSuffix = FileUtils.getFileExtByType(type.getValue());
+        File directory = new File(SystemConfig.UPLOAD_FILE.getUploadBasicPath() + filePath);
+        //如果路径不存在,新建
+        if (!directory.exists() && !directory.isDirectory()) {
+            directory.mkdirs();
+        }
+
+        // 构建新文件名
+        String newFilePath = SystemConfig.UPLOAD_FILE.getUploadBasicPath() + filePath +fileName;
+        RandomAccessFile newFile = new RandomAccessFile(newFilePath, "rw");
+
+        int start = Integer
+                .parseInt(range.substring(6, range.indexOf("-")));
+        int stop = Integer.parseInt(range.substring(range.indexOf("-") + 1, range.length()));
+
+        newFile.seek(start);
+        request.setCharacterEncoding(StandardCharsets.UTF_8.name());
+
+        byte[] buffer = new byte[1048576];
+        int count = 0;
+        while ((count = fsIn.read(buffer)) != -1) {
+            newFile.write(buffer, 0, count);
+        }
+
+        fsIn.close();
+        newFile.close();
+
+        String newPdfFileName = fileName.substring(0, fileName.indexOf(".")) + ".pdf";
+        String newPdfFilePath = SystemConfig.UPLOAD_FILE.getUploadBasicPath() + newPdfFileName;
+
+        // 上传完成,处理office文档
+        if (stop >= fileSize) {
+            switch (type) {
+                case WORD:
+                case WORDX:
+                    OfficeFileUtil.wordToPdf(newFilePath, newPdfFilePath);
+                    break;
+                case EXCEL:
+                case EXCELX:
+                    OfficeFileUtil.excelToPdf(newFilePath, newPdfFilePath);
+                    break;
+                case PPT:
+                case PPTX:
+                    OfficeFileUtil.pptToPdf(newFilePath, newPdfFilePath);
+                    break;
+            }
+        }
+        // 返回上传结果信息
+//        result.setFileId(fileId);
+        result.setFileId(LocalDateTimeUtil.nowTimeStampStr());
+        result.setName(file.getOriginalFilename());
+        result.setNewFileName(fileName);
+        result.setNewPdfFileName("");
+        result.setSize(size);
+        result.setFileType(type.name().toLowerCase());
+        result.setContentType(type.getValue());
+        result.setNewFileView(SystemConfig.UPLOAD_FILE.getFileBasicUrl() + "?path=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
+
+        if (new File(newPdfFilePath).exists()) {
+            result.setNewPdfFileName(newPdfFileName);
+
+        }
+
+        file = null;
+        newFile = null;
+
+        return ExecutedResult.success(result);
+    }
+
+    @SaIgnore
+    @GetMapping(value = "getUploadV2FileLength")
+    public void getUploadV2FileLength(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String fileName = request.getParameter("HGFileName");
+
+        String filePath = "/files";
+        EContentType type = EContentType.getByValue(FileUtils.getMediaTypeByFileName(fileName));
+        // 限制文件上传大小
+        switch (type) {
+            case GIF:
+            case JPG:
+            case PNG:
+            case JPEG:
+            case BMP:
+                filePath = "/images";
+                break;
+            default:
+                break;
+        }
+        filePath += "/uploadV2/";
+        // 构建新文件名
+        String newFilePath = SystemConfig.UPLOAD_FILE.getUploadBasicPath() + filePath +fileName;
+
+        File file = new File(newFilePath);
+        String data = String.valueOf(file.length());
+        OutputStream outputStream = response.getOutputStream();
+        response.setHeader("content-type", "text/html;charset=UTF-8");
+        byte[] dataByteArr = data.getBytes(StandardCharsets.UTF_8);
+        outputStream.write(dataByteArr);
+    }
 }