FileController.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package ieven.server.webapp.api;
  2. import com.mongodb.client.gridfs.model.GridFSFile;
  3. import ieven.server.webapp.domain.file.FileListInput;
  4. import ieven.server.webapp.domain.file.FileService;
  5. import ieven.server.webapp.domain.file.LogicalFile;
  6. import ieven.server.webapp.infrastructure.wrapper.Mapped;
  7. import ieven.server.webapp.model.UploadedFile;
  8. import ieven.server.webapp.model.display.UploadedFileDisplay;
  9. import ieven.server.webapp.util.Common;
  10. import ieven.server.webapp.util.Properties;
  11. import io.swagger.annotations.Api;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.bson.types.ObjectId;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.data.mongodb.core.MongoTemplate;
  16. import org.springframework.data.mongodb.core.query.Criteria;
  17. import org.springframework.data.mongodb.core.query.Query;
  18. import org.springframework.data.mongodb.gridfs.GridFsOperations;
  19. import org.springframework.data.mongodb.gridfs.GridFsTemplate;
  20. import org.springframework.web.bind.annotation.*;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import javax.servlet.ServletException;
  23. import javax.servlet.http.HttpServletRequest;
  24. import javax.servlet.http.HttpServletResponse;
  25. import java.io.IOException;
  26. import java.io.InputStream;
  27. import java.io.OutputStream;
  28. import java.nio.charset.StandardCharsets;
  29. import java.text.SimpleDateFormat;
  30. import java.util.Date;
  31. import java.util.HashMap;
  32. import java.util.List;
  33. import java.util.Map;
  34. import java.util.logging.Logger;
  35. @RestController
  36. @RequestMapping("/file")
  37. @Api(value = "文件操作接口")
  38. public class FileController {
  39. private final Logger logger = Logger.getLogger("UploadController");
  40. @Autowired
  41. private GridFsOperations gridFsOperations;
  42. @Autowired
  43. private MongoTemplate mongoTemplate;
  44. @Autowired
  45. private FileService fileService;
  46. //上传文件
  47. @PostMapping("/uploadSingle")
  48. public Mapped uploadSingle(@RequestParam MultipartFile file, @RequestParam String modelId) {
  49. //异步读取数据并存储到mongo
  50. return fileService.storeUploaded(file, modelId);
  51. }
  52. //列出已上传文件
  53. @PostMapping("/uploadedList")
  54. public Mapped listUploaded(@RequestBody FileListInput fileListInput) {
  55. return fileService.listUploaded(fileListInput);
  56. }
  57. //删除已上传的文件
  58. @PostMapping("/deleteUploaded")
  59. public Map<String, Object> deleteUploaded(@RequestBody Map<String, Object> jsonMap) {
  60. String fileId = (String) jsonMap.getOrDefault("id", "");
  61. if (StringUtils.isBlank(fileId)) {
  62. return Common.errorMapWithPage("未找到参数");
  63. }
  64. Query queryUploaded = new Query(Criteria.where("_id").is(new ObjectId(fileId)));
  65. mongoTemplate.remove(queryUploaded, Properties.COLLECTION_UPLOADED);
  66. Query queryData = new Query(Criteria.where("fileId").is(fileId));
  67. mongoTemplate.remove(queryData, Properties.COLLECTION_DATA);
  68. gridFsOperations.delete(queryUploaded);
  69. Map<String, Object> res = new HashMap<>();
  70. res.put("code", 200);
  71. res.put("result", "");
  72. return res;
  73. }
  74. @GetMapping("/downloadById")
  75. public void downloadById(HttpServletRequest request, HttpServletResponse response, @RequestBody Map<String, Object> jsonMap) {
  76. String fileId = (String) jsonMap.getOrDefault("id", "");
  77. GridFSFile gridFSFile = gridFsOperations.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId))));
  78. if (gridFSFile == null) {
  79. return;
  80. }
  81. String filename = gridFSFile.getFilename();
  82. try {
  83. response.setHeader("Content-Type", "multipart/form-data");
  84. //设置下载的文件的名称-该方式已解决中文乱码问题
  85. response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
  86. response.setHeader("Content-Length", String.valueOf(gridFSFile.getLength()));
  87. OutputStream out = response.getOutputStream();
  88. InputStream input = gridFsOperations.getResource(gridFSFile).getInputStream();
  89. byte[] b = new byte[2048];
  90. int len;
  91. while ((len = input.read(b)) != -1) {
  92. out.write(b, 0, len);
  93. }
  94. input.close();
  95. } catch (IOException e) {
  96. logger.info("下载文件失败:" + filename);
  97. e.printStackTrace();
  98. }
  99. }
  100. }