123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- 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<Sheet> sheets = reader.getSheets();
- List<String> headers = new ArrayList<>();
- for (Sheet sheet : sheets) {
- reader.setSheet(sheet);
- List<Object> 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<String, Object> 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);
- }
- }
- }
|