You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
6.5 KiB
183 lines
6.5 KiB
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<String, Object> uploadFiles(
|
|
@RequestParam("files") MultipartFile[] files,
|
|
@RequestParam(value = "folder", defaultValue = "images") String folder) {
|
|
log.info("批量上传文件数: {}, 文件夹: {}", files.length, folder);
|
|
|
|
List<FileUploadResponse> 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<String, Object> 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<String, Object> uploadImages(@RequestParam("files") MultipartFile[] files) {
|
|
List<FileUploadResponse> 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<String, Object> 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<String, String> deleteFile(@RequestParam("url") String url) {
|
|
log.info("删除文件: {}", url);
|
|
ossUtil.deleteFile(url);
|
|
|
|
Map<String, String> result = new HashMap<>();
|
|
result.put("message", "文件删除成功");
|
|
result.put("url", url);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 批量删除文件
|
|
*/
|
|
@DeleteMapping("/delete/batch")
|
|
public Map<String, Object> deleteFiles(@RequestBody List<String> urls) {
|
|
log.info("批量删除文件数: {}", urls.size());
|
|
ossUtil.deleteFiles(urls);
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
result.put("message", "文件批量删除成功");
|
|
result.put("count", urls.size());
|
|
result.put("urls", urls);
|
|
return result;
|
|
}
|
|
}
|
|
|