| | |
| | | import io.minio.PutObjectArgs; |
| | | import lombok.Cleanup; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.StringUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | |
| | | */ |
| | | public String upload(MultipartFile file) throws IOException { |
| | | try { |
| | | return upload(OssConfiguration.bucket, null, file); |
| | | return upload(OssConfiguration.bucket, file); |
| | | } catch (Exception e) { |
| | | throw new IOException(e.getMessage(), e); |
| | | } |
| | |
| | | ? extractFilename(file) |
| | | : object; |
| | | |
| | | // 通过文件扩展名获取 MIME 类型 |
| | | String contentType = getMimeTypeByExtension(file.getOriginalFilename()); |
| | | |
| | | @Cleanup |
| | | InputStream inputStream = file.getInputStream(); |
| | | // 上传文件到 Minio |
| | | this.ossService.putObject(bucket, objectName, inputStream); |
| | | this.ossService.putObject(bucket, objectName, inputStream, contentType); |
| | | |
| | | // ✅ 拼接永久 URL(不带 presigned 过期参数) |
| | | String baseUrl = OssConfiguration.endpoint; |
| | |
| | | throw new RuntimeException("Upload failed: " + e.getMessage(), e); |
| | | } |
| | | } |
| | | @Async("threadPoolTaskExecutor") |
| | | public String upload(String bucket, String objectKey, InputStream input, String contentType) { |
| | | try { |
| | | // 上传文件时指定 Content-Type |
| | | this.ossService.putObject(bucket, objectKey, input, contentType); |
| | | |
| | | // ✅ 构建永久访问 URL |
| | | String baseUrl = OssConfiguration.endpoint; |
| | | if (!baseUrl.endsWith("/")) { |
| | | baseUrl += "/"; |
| | | } |
| | | return baseUrl + bucket + "/" + objectKey; |
| | | } catch (Exception e) { |
| | | throw new RuntimeException("Upload failed: " + e.getMessage(), e); |
| | | } |
| | | } |
| | | // 获取文件 MIME 类型 |
| | | public String getMimeTypeByExtension(String fileName) { |
| | | // 获取文件扩展名 |
| | | String extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase(); |
| | | |
| | | // 根据文件扩展名返回 MIME 类型 |
| | | switch (extension) { |
| | | case "jpg": |
| | | case "jpeg": |
| | | return "image/jpeg"; |
| | | case "png": |
| | | return "image/png"; |
| | | case "gif": |
| | | return "image/gif"; |
| | | case "pdf": |
| | | return "application/pdf"; |
| | | case "txt": |
| | | return "text/plain"; |
| | | case "html": |
| | | return "text/html"; |
| | | case "json": |
| | | return "application/json"; |
| | | case "csv": |
| | | return "text/csv"; |
| | | case "zip": |
| | | return "application/zip"; |
| | | // 添加更多的扩展名映射 |
| | | default: |
| | | return "application/octet-stream"; // 默认 MIME 类型 |
| | | } |
| | | } |
| | | |
| | | } |