package com.ruoyi.system.service.impl; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import com.ruoyi.common.config.FileUploadConfig; import com.ruoyi.common.config.OssConfig; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.service.OssService; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.Objects; import java.util.UUID; /** * @author mitao * @date 2024/12/23 */ @Service public class OssServiceImpl implements OssService { @Autowired private FileUploadConfig fileUploadConfig; /** * 文件上传 * * @param file * @return */ @Override public String uploadFile(MultipartFile file) throws IOException { if (Objects.isNull(file)) { throw new ServiceException("文件不能为空"); } // 获取文件名称 String filename = file.getOriginalFilename(); // 获取文件后缀 String ext = filename.substring(filename.lastIndexOf("."), filename.length()); // 检查文件类型 if (!fileUploadConfig.getAllowExt().contains(ext)) { throw new ServiceException("上传文件格式不正确,仅支持"+ fileUploadConfig.getAllowExt()); } return upload(OssConfig.FOLDER, file); } /** * 文件上传,指定上传路径 * * @param storagePath * @param file * @return */ @Override public String upload(String storagePath, MultipartFile file) throws IOException { CredentialsProvider credentialsProvider = new DefaultCredentialProvider(OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET); String region = "cn-chengdu"; // 创建OSSClient实例。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(OssConfig.UPLOAD_ENDPOINT) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); InputStream inputStream = file.getInputStream(); String originFileName = file.getOriginalFilename(); String fileExt = Objects.requireNonNull(originFileName).substring(originFileName.lastIndexOf(".") + 1); String fileName = originFileName.substring(0, originFileName.lastIndexOf(".")); // 设置文件名 String filePathName = generateRelativeStoragePath(storagePath, fileExt, fileName); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(OssConfig.BUCKET_NAME, filePathName, inputStream); // 创建PutObject请求。 PutObjectResult result = ossClient.putObject(putObjectRequest); return OssConfig.DOWNLOAD_ENDPOINT + filePathName; } /** *
     * 获取存储的相对路径
     * 规则path + / + yyyyMMddHH  + uuid
     * 
* * @param storagePath * @return */ private static String generateRelativeStoragePath(String storagePath, String fileType, String fileName) { String time = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); String uuid = UUID.randomUUID().toString(); StringBuilder sb = new StringBuilder(); if (StringUtils.isNotBlank(storagePath)) { sb.append(storagePath).append("/"); } if (fileName == null) { sb.append(time).append(uuid); } else { sb.append(fileName).append(time); } if (StringUtils.isNotBlank(fileType)) { sb.append(".").append(fileType); } return sb.toString(); } }