From 30344b2162127ad60546eba4379d8f6bccf1a5a4 Mon Sep 17 00:00:00 2001 From: heshunme Date: Thu, 4 Jul 2024 00:33:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=9A=84=E5=90=8E=E7=AB=AF=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FileController.java | 65 +++++++++++++++++++ .../dto/UploadFileResponse.java | 16 +++++ 2 files changed, 81 insertions(+) create mode 100644 src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java create mode 100644 src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java diff --git a/src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java b/src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java new file mode 100644 index 0000000..b48660a --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/controller/FileController.java @@ -0,0 +1,65 @@ +package org.cmh.backend.NewsManagement.controller; + +import org.cmh.backend.NewsManagement.dto.UploadFileResponse; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +@RestController +@CrossOrigin // 如果前端和后端不在同一个域名或端口下,需要启用跨域 +public class FileController { + + private static final String UPLOAD_DIR = "uploads/"; + + @PostMapping("/news/uploadPic") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return new ResponseEntity<>(new UploadFileResponse("文件不能为空", null), HttpStatus.BAD_REQUEST); + } + + try { + // 确保上传目录存在 + Path uploadDirPath = Paths.get(UPLOAD_DIR); + if (!Files.exists(uploadDirPath)) { + Files.createDirectories(uploadDirPath); + } + + // 生成文件路径 + byte[] bytes = file.getBytes(); + Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename()); + Files.write(path, bytes); + + // 返回成功信息 + return new ResponseEntity<>(new UploadFileResponse("文件上传成功", "/api/news/files/" + file.getOriginalFilename()), HttpStatus.OK); + } catch (IOException e) { + return new ResponseEntity<>(new UploadFileResponse("文件上传失败", null), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/news/files/{filename}") + public ResponseEntity getFile(@PathVariable String filename) { + try { + Path filePath = Paths.get(UPLOAD_DIR).resolve(filename).normalize(); + Resource resource = new UrlResource(filePath.toUri()); + + if (resource.exists() && resource.isReadable()) { + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") + .body(resource); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} diff --git a/src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java b/src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java new file mode 100644 index 0000000..b2eba96 --- /dev/null +++ b/src/main/java/org/cmh/backend/NewsManagement/dto/UploadFileResponse.java @@ -0,0 +1,16 @@ +package org.cmh.backend.NewsManagement.dto; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UploadFileResponse extends MessageResponse { + private String url; + + public UploadFileResponse(String message, String url) { + super(message); + this.url = url; + } +}