package ieven.server.webapp.api; import com.mongodb.client.gridfs.model.GridFSFile; import ieven.server.webapp.domain.file.FileListInput; import ieven.server.webapp.domain.file.FileService; import ieven.server.webapp.domain.file.LogicalFile; import ieven.server.webapp.infrastructure.wrapper.Mapped; import ieven.server.webapp.model.UploadedFile; import ieven.server.webapp.model.display.UploadedFileDisplay; import ieven.server.webapp.util.Common; import ieven.server.webapp.util.Properties; import io.swagger.annotations.Api; import org.apache.commons.lang3.StringUtils; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.gridfs.GridFsOperations; import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; @RestController @RequestMapping("/file") @Api(value = "文件操作接口") public class FileController { private final Logger logger = Logger.getLogger("UploadController"); @Autowired private GridFsOperations gridFsOperations; @Autowired private MongoTemplate mongoTemplate; @Autowired private FileService fileService; //上传文件 @PostMapping("/uploadSingle") public Mapped uploadSingle(@RequestParam MultipartFile file, @RequestParam String modelId) { //异步读取数据并存储到mongo return fileService.storeUploaded(file, modelId); } //列出已上传文件 @PostMapping("/uploadedList") public Mapped listUploaded(@RequestBody FileListInput fileListInput) { return fileService.listUploaded(fileListInput); } //删除已上传的文件 @PostMapping("/deleteUploaded") public Map deleteUploaded(@RequestBody Map jsonMap) { String fileId = (String) jsonMap.getOrDefault("id", ""); if (StringUtils.isBlank(fileId)) { return Common.errorMapWithPage("未找到参数"); } Query queryUploaded = new Query(Criteria.where("_id").is(new ObjectId(fileId))); mongoTemplate.remove(queryUploaded, Properties.COLLECTION_UPLOADED); Query queryData = new Query(Criteria.where("fileId").is(fileId)); mongoTemplate.remove(queryData, Properties.COLLECTION_DATA); gridFsOperations.delete(queryUploaded); Map res = new HashMap<>(); res.put("code", 200); res.put("result", ""); return res; } @GetMapping("/downloadById") public void downloadById(HttpServletRequest request, HttpServletResponse response, @RequestBody Map jsonMap) { String fileId = (String) jsonMap.getOrDefault("id", ""); GridFSFile gridFSFile = gridFsOperations.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId)))); if (gridFSFile == null) { return; } String filename = gridFSFile.getFilename(); try { response.setHeader("Content-Type", "multipart/form-data"); //设置下载的文件的名称-该方式已解决中文乱码问题 response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); response.setHeader("Content-Length", String.valueOf(gridFSFile.getLength())); OutputStream out = response.getOutputStream(); InputStream input = gridFsOperations.getResource(gridFSFile).getInputStream(); byte[] b = new byte[2048]; int len; while ((len = input.read(b)) != -1) { out.write(b, 0, len); } input.close(); } catch (IOException e) { logger.info("下载文件失败:" + filename); e.printStackTrace(); } } }