|
|
@@ -0,0 +1,129 @@
|
|
|
+package com.jzg.controller;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.jzg.core.page.HttpResult;
|
|
|
+import com.jzg.entity.po.SysUploadFiles;
|
|
|
+import com.jzg.mapper.SysUploadFilesMapper;
|
|
|
+import com.jzg.util.FileUtils;
|
|
|
+import com.jzg.util.idgen.IdGenerate;
|
|
|
+import io.minio.*;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestParam;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.InputStream;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 文件上传接口
|
|
|
+ */
|
|
|
+
|
|
|
+@RestController
|
|
|
+@RequestMapping("/file")
|
|
|
+public class FileUploadController {
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MinioClient minioClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysUploadFilesMapper sysUploadFilesMapper;
|
|
|
+
|
|
|
+ @Value("${minio.bucket-name}")
|
|
|
+ private String bucketName;
|
|
|
+
|
|
|
+ @PostMapping("/upload")
|
|
|
+ public HttpResult uploadFile(@RequestParam("file") MultipartFile file) {
|
|
|
+ try {
|
|
|
+ // 获取文件原始名称和扩展名
|
|
|
+ String originalFileName = file.getOriginalFilename();
|
|
|
+ String extension = getFileExtension(originalFileName);
|
|
|
+
|
|
|
+ // MD5,ETag
|
|
|
+ String fileMD5 = FileUtils.getFileMD5(file);
|
|
|
+ String objectName = generateObjectName(originalFileName, fileMD5, extension);
|
|
|
+ String fileETag = FileUtils.getFileETag(file);
|
|
|
+
|
|
|
+ // 查找文件是否已经存在于MinIO
|
|
|
+ if (isFileExistsInMinIO(objectName, fileETag)) {
|
|
|
+ return HttpResult.ok(getFileFromDatabase(fileETag));
|
|
|
+ }
|
|
|
+
|
|
|
+ //如果文件不存在,执行上传操作
|
|
|
+ SysUploadFiles sysUploadFiles = uploadFileToMinIO(file, objectName, fileETag, extension);
|
|
|
+
|
|
|
+ return HttpResult.ok(sysUploadFiles);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return HttpResult.error("文件上传失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getFileExtension(String fileName) {
|
|
|
+ return fileName.substring(fileName.lastIndexOf("."));
|
|
|
+ }
|
|
|
+
|
|
|
+ private String generateObjectName(String originalFileName, String fileMD5, String extension) {
|
|
|
+ return originalFileName.substring(0, originalFileName.lastIndexOf(".")) + "_" + fileMD5 + extension;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isFileExistsInMinIO(String objectName, String fileETag) {
|
|
|
+ try {
|
|
|
+ StatObjectArgs statObjectArgs = StatObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ StatObjectResponse statObjectResponse = minioClient.statObject(statObjectArgs);
|
|
|
+ String minioFileETag = statObjectResponse.etag();
|
|
|
+
|
|
|
+ return minioFileETag.equals(fileETag);
|
|
|
+ } catch (Exception e) {
|
|
|
+ return false; // 如果获取对象出错,认为文件不存在
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private SysUploadFiles getFileFromDatabase(String fileETag) {
|
|
|
+ SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<SysUploadFiles>().eq(SysUploadFiles::getEtag, fileETag));
|
|
|
+
|
|
|
+ if (sysUploadFiles == null) {
|
|
|
+ sysUploadFiles = new SysUploadFiles();
|
|
|
+ sysUploadFiles.setId(IdGenerate.nextId());
|
|
|
+ sysUploadFiles.setCreateTime(LocalDateTime.now());
|
|
|
+ sysUploadFilesMapper.insert(sysUploadFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ return sysUploadFiles;
|
|
|
+ }
|
|
|
+
|
|
|
+ private SysUploadFiles uploadFileToMinIO(MultipartFile file, String objectName, String fileETag, String extension) throws Exception {
|
|
|
+ // 上传到minio
|
|
|
+ InputStream fileInputStream = file.getInputStream();
|
|
|
+ ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .stream(fileInputStream, file.getSize(), -1)
|
|
|
+ .contentType(file.getContentType())
|
|
|
+ .build());
|
|
|
+
|
|
|
+ SysUploadFiles sysUploadFiles = new SysUploadFiles();
|
|
|
+ sysUploadFiles.setId(IdGenerate.nextId());
|
|
|
+ sysUploadFiles.setFileName(objectName);
|
|
|
+ sysUploadFiles.setFileType(extension.substring(1));
|
|
|
+ sysUploadFiles.setBucketName(bucketName);
|
|
|
+ sysUploadFiles.setEtag(objectWriteResponse.etag());
|
|
|
+ sysUploadFiles.setCreateTime(LocalDateTime.now());
|
|
|
+ sysUploadFilesMapper.insert(sysUploadFiles);
|
|
|
+
|
|
|
+ return sysUploadFiles;
|
|
|
+ }
|
|
|
+}
|