package com.campus.controller; import com.campus.dto.response.FileUploadResponse; import com.campus.util.OssUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/api/file") @CrossOrigin public class FileUploadController { @Autowired private OssUtil ossUtil; /** * 通用文件上传 */ @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FileUploadResponse uploadFile( @RequestParam("file") MultipartFile file, @RequestParam(value = "folder", defaultValue = "images") String folder) { log.info("上传文件: {}, 文件夹: {}", file.getOriginalFilename(), folder); String url = ossUtil.uploadFile(file, folder); return FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build(); } /** * 上传图片 */ @PostMapping(value = "/upload/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FileUploadResponse uploadImage(@RequestParam("file") MultipartFile file) { String url = ossUtil.uploadImage(file); return FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build(); } /** * 上传视频 */ @PostMapping(value = "/upload/video", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FileUploadResponse uploadVideo(@RequestParam("file") MultipartFile file) { long startTime = System.currentTimeMillis(); String url = ossUtil.uploadVideo(file); long elapsed = System.currentTimeMillis() - startTime; log.info("视频上传完成: {}, 大小: {}MB, 总耗时: {}ms", file.getOriginalFilename(), String.format("%.1f", file.getSize() / 1024.0 / 1024.0), elapsed); return FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build(); } /** * 上传文档 */ @PostMapping(value = "/upload/document", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FileUploadResponse uploadDocument(@RequestParam("file") MultipartFile file) { String url = ossUtil.uploadDocument(file); return FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build(); } /** * 上传头像 */ @PostMapping(value = "/upload/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FileUploadResponse uploadAvatar(@RequestParam("file") MultipartFile file) { String url = ossUtil.uploadAvatar(file); return FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build(); } /** * 批量上传文件 */ @PostMapping(value = "/upload/batch", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Map uploadFiles( @RequestParam("files") MultipartFile[] files, @RequestParam(value = "folder", defaultValue = "images") String folder) { log.info("批量上传文件数: {}, 文件夹: {}", files.length, folder); List responses = new ArrayList<>(); for (MultipartFile file : files) { String url = ossUtil.uploadFile(file, folder); responses.add(FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build()); } Map result = new HashMap<>(); result.put("successCount", responses.size()); result.put("files", responses); return result; } /** * 批量上传图片 */ @PostMapping(value = "/upload/images", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Map uploadImages(@RequestParam("files") MultipartFile[] files) { List responses = new ArrayList<>(); for (MultipartFile file : files) { String url = ossUtil.uploadImage(file); responses.add(FileUploadResponse.builder() .url(url) .fileName(file.getOriginalFilename()) .fileSize(file.getSize()) .fileType(file.getContentType()) .build()); } Map result = new HashMap<>(); result.put("successCount", responses.size()); result.put("urls", responses.stream().map(FileUploadResponse::getUrl).collect(Collectors.toList())); result.put("files", responses); return result; } /** * 删除文件 */ @DeleteMapping("/delete") public Map deleteFile(@RequestParam("url") String url) { log.info("删除文件: {}", url); ossUtil.deleteFile(url); Map result = new HashMap<>(); result.put("message", "文件删除成功"); result.put("url", url); return result; } /** * 批量删除文件 */ @DeleteMapping("/delete/batch") public Map deleteFiles(@RequestBody List urls) { log.info("批量删除文件数: {}", urls.size()); ossUtil.deleteFiles(urls); Map result = new HashMap<>(); result.put("message", "文件批量删除成功"); result.put("count", urls.size()); result.put("urls", urls); return result; } }