|
@@ -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);
|
|
|
+ }
|
|
|
}
|