package ieven.server.webapp.api; import cn.hutool.core.io.FileUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import com.mongodb.client.gridfs.model.GridFSFile; import ieven.server.webapp.domain.IdInput; import ieven.server.webapp.domain.file.FileListInput; import ieven.server.webapp.domain.file.FileService; import ieven.server.webapp.infrastructure.wrapper.Mapped; import ieven.server.webapp.util.EncodeDetector; import ieven.server.webapp.util.FileUtils; import io.swagger.annotations.Api; import org.apache.poi.ss.usermodel.Sheet; 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.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; 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; public FileController() { } @PostMapping({"/uploadSingle"}) public Mapped uploadSingle(@RequestParam MultipartFile file, @RequestParam String modelId) throws Exception { String filename = file.getOriginalFilename(); String extName = FileUtil.extName(filename); String contentType = file.getContentType(); ByteArrayOutputStream baos = FileUtils.cloneInputStream(file.getInputStream()); if (extName.equalsIgnoreCase("xls") || extName.equalsIgnoreCase("xlsx")) { ExcelReader reader = ExcelUtil.getReader(new ByteArrayInputStream(baos.toByteArray())); List sheets = reader.getSheets(); List headers = new ArrayList<>(); for (Sheet sheet : sheets) { reader.setSheet(sheet); List objects = reader.readRow(0); if (objects.size() > 1) { // 至少大于1 StringBuilder stringBuilder = new StringBuilder(); for (Object object : objects) { stringBuilder.append(object); } headers.add(stringBuilder.toString()); } } if (headers.size() > 1) { // 判断sheet第一行内容是否一致 StringBuilder errorHeaders = new StringBuilder(); String baseHeader = headers.get(0); for (int i = 0; i < headers.size(); i++) { // if (i == 0) { continue; } if (!headers.get(i).equals(baseHeader)) { errorHeaders.append("sheet").append(i).append("标题列与第一个sheet不一致!"); } } if (errorHeaders.length() > 0) { return Mapped.ERROR(errorHeaders.toString()); } } reader.close(); } String encoding = EncodeDetector.getEncoding(baos.toByteArray()); baos.close(); return this.fileService.storeUploaded( new ByteArrayInputStream(baos.toByteArray()), encoding, filename, contentType, modelId); } @PostMapping({"/uploadedList"}) public Mapped listUploaded(@RequestBody FileListInput fileListInput) { return this.fileService.listUploaded(fileListInput); } @PostMapping({"/uploadedGroupList"}) public Mapped listGroupUploaded(@RequestBody FileListInput fileListInput) { return this.fileService.listGroupUploaded(fileListInput); } @PostMapping({"/deleteById"}) public Map deleteById(@RequestBody IdInput idInput) { return this.fileService.deleteById(idInput); } @GetMapping({"/downloadById"}) public void downloadById(HttpServletResponse response, @RequestBody IdInput idInput) { String fileId = idInput.getId(); GridFSFile gridFSFile = this.gridFsOperations.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId)))); if (gridFSFile != null) { 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 = this.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 var11) { this.logger.info("下载文件失败:" + filename); var11.printStackTrace(); } } } @GetMapping({"/downloadAndDeleteById"}) public void downloadAndDeleteById( HttpServletResponse response, @RequestParam("id") String fileId) { GridFSFile gridFSFile = this.gridFsOperations.findOne(new Query(Criteria.where("_id").is(new ObjectId(fileId)))); if (gridFSFile != null) { 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 = this.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 var9) { this.logger.info("下载文件失败:" + filename); var9.printStackTrace(); } this.fileService.removePhysicalFile(fileId); } } }