前期准备
- 创建一个新的Bucket(选择标准存储类型)
- 在RAM访问控制中新建一个用户账号
- 妥善保管AccessKey ID和AccessKey Secret(Bucket创建后才能获取,且仅显示一次)
- 为新建用户授予AliyunOSSFullAccess权限
Java实现头像文件上传
添加依赖
<!-- 阿里云OSS SDK -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
配置文件(application.yml)
#---------阿里云OSS配置---------
aliyun:
oss:
endpoint: [外网访问的地域节点]
access-key-id: [访问密钥ID]
access-key-secret: [访问密钥密码]
bucketname: [存储空间名称]
配置类
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
@Data
public class OssProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketname;
}
控制层(文件上传接口)
@RestController
@RequestMapping("/api/user_img")
public class UserController {
@Autowired
private FileStorageService storageService;
@PostMapping("upload")
public JsonData uploadAvatar(@RequestPart("file") MultipartFile imageFile) {
String imageUrl = storageService.uploadAvatar(imageFile);
if (imageUrl != null) {
return JsonData.buildSuccess(imageUrl);
}
return JsonData.buildResult("用户头像上传失败");
}
}
服务层实现
public interface FileStorageService {
String uploadAvatar(MultipartFile file);
}
@Service
@Slf4j
public class FileStorageServiceImpl implements FileStorageService {
@Autowired
private OssProperties ossProperties;
@Override
public String uploadAvatar(MultipartFile file) {
String bucketName = ossProperties.getBucketname();
String endpoint = ossProperties.getEndpoint();
String accessKey = ossProperties.getAccessKeyId();
String secretKey = ossProperties.getAccessKeySecret();
// 创建OSS客户端实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
// 获取原始文件名(例如:avatar.jpg)
String originalFilename = file.getOriginalFilename();
// 使用当前日期创建存储路径
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
// 构建路径:avatars/2023/07/18/uuid.jpg
String datePath = formatter.format(now);
String uniqueID = UUID.randomUUID().toString().replace("-", "");
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
String objectKey = "avatars/" + datePath + "/" + uniqueID + extension;
try {
// 执行文件上传
PutObjectResult result = ossClient.putObject(bucketName, objectKey, file.getInputStream());
if (result != null) {
// 构建可访问的URL
return "https://" + bucketName + "." + endpoint + "/" + objectKey;
}
} catch (IOException e) {
log.error("头像文件上传失败", e);
} finally {
ossClient.shutdown();
}
return null;
}
}