FileController.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package ieven.server.webapp.api;
  2. import cn.hutool.core.io.FileUtil;
  3. import cn.hutool.poi.excel.ExcelReader;
  4. import cn.hutool.poi.excel.ExcelUtil;
  5. import com.mongodb.client.gridfs.model.GridFSFile;
  6. import ieven.server.webapp.domain.IdInput;
  7. import ieven.server.webapp.domain.file.FileListInput;
  8. import ieven.server.webapp.domain.file.FileService;
  9. import ieven.server.webapp.infrastructure.wrapper.Mapped;
  10. import ieven.server.webapp.util.EncodeDetector;
  11. import ieven.server.webapp.util.FileUtils;
  12. import io.swagger.annotations.Api;
  13. import org.apache.poi.ss.usermodel.Sheet;
  14. import org.bson.types.ObjectId;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.data.mongodb.core.MongoTemplate;
  17. import org.springframework.data.mongodb.core.query.Criteria;
  18. import org.springframework.data.mongodb.core.query.Query;
  19. import org.springframework.data.mongodb.gridfs.GridFsOperations;
  20. import org.springframework.web.bind.annotation.*;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import javax.servlet.http.HttpServletResponse;
  23. import java.io.*;
  24. import java.nio.charset.StandardCharsets;
  25. import java.util.ArrayList;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.logging.Logger;
  29. @RestController
  30. @RequestMapping("/file")
  31. @Api(value = "文件操作接口")
  32. public class FileController {
  33. private final Logger logger = Logger.getLogger("UploadController");
  34. @Autowired
  35. private GridFsOperations gridFsOperations;
  36. @Autowired
  37. private MongoTemplate mongoTemplate;
  38. @Autowired
  39. private FileService fileService;
  40. public FileController() {
  41. }
  42. @PostMapping({"/uploadSingle"})
  43. public Mapped uploadSingle(@RequestParam MultipartFile file, @RequestParam String modelId)
  44. throws Exception {
  45. String filename = file.getOriginalFilename();
  46. String extName = FileUtil.extName(filename);
  47. String contentType = file.getContentType();
  48. ByteArrayOutputStream baos = FileUtils.cloneInputStream(file.getInputStream());
  49. if (extName.equalsIgnoreCase("xls") || extName.equalsIgnoreCase("xlsx")) {
  50. ExcelReader reader = ExcelUtil.getReader(new ByteArrayInputStream(baos.toByteArray()));
  51. List<Sheet> sheets = reader.getSheets();
  52. List<String> headers = new ArrayList<>();
  53. for (Sheet sheet : sheets) {
  54. reader.setSheet(sheet);
  55. List<Object> objects = reader.readRow(0);
  56. if (objects.size() > 1) { // 至少大于1
  57. StringBuilder stringBuilder = new StringBuilder();
  58. for (Object object : objects) {
  59. stringBuilder.append(object);
  60. }
  61. headers.add(stringBuilder.toString());
  62. }
  63. }
  64. if (headers.size() > 1) {
  65. // 判断sheet第一行内容是否一致
  66. StringBuilder errorHeaders = new StringBuilder();
  67. String baseHeader = headers.get(0);
  68. for (int i = 0; i < headers.size(); i++) {
  69. //
  70. if (i == 0) {
  71. continue;
  72. }
  73. if (!headers.get(i).equals(baseHeader)) {
  74. errorHeaders.append("sheet").append(i).append("标题列与第一个sheet不一致!");
  75. }
  76. }
  77. if (errorHeaders.length() > 0) {
  78. return Mapped.ERROR(errorHeaders.toString());
  79. }
  80. }
  81. reader.close();
  82. }
  83. String encoding = EncodeDetector.getEncoding(baos.toByteArray());
  84. baos.close();
  85. return this.fileService.storeUploaded(
  86. new ByteArrayInputStream(baos.toByteArray()), encoding, filename, contentType, modelId);
  87. }
  88. @PostMapping({"/uploadedList"})
  89. public Mapped listUploaded(@RequestBody FileListInput fileListInput) {
  90. return this.fileService.listUploaded(fileListInput);
  91. }
  92. @PostMapping({"/uploadedGroupList"})
  93. public Mapped listGroupUploaded(@RequestBody FileListInput fileListInput) {
  94. return this.fileService.listGroupUploaded(fileListInput);
  95. }
  96. @PostMapping({"/deleteById"})
  97. public Map<String, Object> deleteById(@RequestBody IdInput idInput) {
  98. return this.fileService.deleteById(idInput);
  99. }
  100. @GetMapping({"/downloadById"})
  101. public void downloadById(HttpServletResponse response, @RequestBody IdInput idInput) {
  102. String fileId = idInput.getId();
  103. GridFSFile gridFSFile =
  104. this.gridFsOperations.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId))));
  105. if (gridFSFile != null) {
  106. String filename = gridFSFile.getFilename();
  107. try {
  108. response.setHeader("Content-Type", "multipart/form-data");
  109. response.addHeader(
  110. "Content-Disposition",
  111. "attachment;filename="
  112. + new String(
  113. filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
  114. response.setHeader("Content-Length", String.valueOf(gridFSFile.getLength()));
  115. OutputStream out = response.getOutputStream();
  116. InputStream input = this.gridFsOperations.getResource(gridFSFile).getInputStream();
  117. byte[] b = new byte[2048];
  118. int len;
  119. while ((len = input.read(b)) != -1) {
  120. out.write(b, 0, len);
  121. }
  122. input.close();
  123. } catch (IOException var11) {
  124. this.logger.info("下载文件失败:" + filename);
  125. var11.printStackTrace();
  126. }
  127. }
  128. }
  129. @GetMapping({"/downloadAndDeleteById"})
  130. public void downloadAndDeleteById(
  131. HttpServletResponse response, @RequestParam("id") String fileId) {
  132. GridFSFile gridFSFile =
  133. this.gridFsOperations.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId))));
  134. if (gridFSFile != null) {
  135. String filename = gridFSFile.getFilename();
  136. try {
  137. response.setHeader("Content-Type", "multipart/form-data");
  138. response.addHeader(
  139. "Content-Disposition",
  140. "attachment;filename="
  141. + new String(
  142. filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
  143. response.setHeader("Content-Length", String.valueOf(gridFSFile.getLength()));
  144. OutputStream out = response.getOutputStream();
  145. InputStream input = this.gridFsOperations.getResource(gridFSFile).getInputStream();
  146. byte[] b = new byte[2048];
  147. int len;
  148. while ((len = input.read(b)) != -1) {
  149. out.write(b, 0, len);
  150. }
  151. input.close();
  152. } catch (IOException var9) {
  153. this.logger.info("下载文件失败:" + filename);
  154. var9.printStackTrace();
  155. }
  156. this.fileService.removePhysicalFile(fileId);
  157. }
  158. }
  159. }