概要
在项目开发过程中,时常需要用到文件上传功能,直接存储到服务器,成本太高,并且不稳定,所以我们采用云服务商的对象存储服务(OSS)。
在本文中,仅对标介绍苍穹外卖中的文件上传功能。
技术名词
- 对象存储(OSS)
如何获取一份OSS配置?
首先,我们需要注册并登陆阿里云服务平台,然后搜索对象存储OSS。

随后点击操作面板左侧的Bucket列表,创建出Bucket。

对于本项目来说,基本不用做修改,可直接点击创建。
随后,我们需要修改Bucket权限,我们先进入Bucket详情,然后选择"权限控制",如下图:

我们需要关闭“阻止公共访问”并修改读写权限为“公共读”。
随后在右上角头像处,选择“AccessKey”,创建出属于你的AccessKey。

需要注意的是,这个AccessKey需要保存好,在此页面只能查看一次,如果遗忘只能重新创建,当然,如果泄漏了,也会使自己的资产受到损失。
在苍穹外卖中,是如何实现文件上传的?
首先,我们需要创建出OSS的工具类 – AliOssUtil
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/**
* 文件上传
*
* @param bytes
* @param objectName
* @return
*/
public String upload(byte[] bytes, String objectName) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObject请求。
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
//文件访问路径规则 https://BucketName.Endpoint/ObjectName
StringBuilder stringBuilder = new StringBuilder("https://");
stringBuilder
.append(bucketName)
.append(".")
.append(endpoint)
.append("/")
.append(objectName);
log.info("文件上传到:{}", stringBuilder.toString());
return stringBuilder.toString();
}
}
在项目中,这个工具类已经为我们创建好了。有了工具类,接着我们就需要调用工具类,创建出AliOssUtil对象。
所以,我们创建出Configuration配置类,用来创建AliOssUitl对象。
/**
* OSS配置类,用来创建AliOssUtil对象
*/
@Configuration
@Slf4j
public class OssConfiguration {
@Bean
@ConditionalOnMissingBean // 如果bean存在就不重复创建,如果不存在就创建
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {
log.info("开始创建AliOssUtil对象:{}", aliOssProperties);
return new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
}
}
对于这个配置类的作用,我们可以将其看作初始化AliOssUtil对象。
随后我们继续开发Controller,我们前面已经创建并初始化了AliOssUtil对象,在这里我们就直接选择注入。
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {
@Autowired
private AliOssUtil aliOssUtil;
/**
* 文件上传
* @param file
* @return
*/
@ApiOperation("文件上传")
@PostMapping("/upload")
public Result<String> upload(MultipartFile file) {
log.info("开始进行文件上传:{}", file);
try {
// 先获取原文件名
String originalFilename = file.getOriginalFilename();
// 获取文件拓展名
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
// 使用UUID防止原文件名重复
String objectName = UUID.randomUUID().toString() + extension;
String filePath = aliOssUtil.upload(file.getBytes(), objectName);
return Result.success(filePath);
} catch (Exception e) {
log.info("文件上传失败:{}", e);
}
return null;
}
}
对这部分我们再来看看,我们在这里修改了原文件名,为了防止出现文件名重复的情况,所以我们使用UUID来随机命名我们的文件,所以我们需要先取出文件名,并截取出拓展名,最后用UUID + 拓展名构成文件路径(文件名),最后调用upload()去上传该文件。
小结
- 技术选型:采用阿里云OSS替代本地存储,解决成本高、不稳定的问题
- 实现流程:配置获取 → 工具类封装 → 配置类初始化 → 控制器调用
- 关键细节:
- Bucket需配置为"公共读"权限
- AccessKey需妥善保管,仅可查看一次
- 使用UUID+扩展名方式避免文件名重复
- 文件访问路径格式:
https://BucketName.Endpoint/ObjectName
通过本文的步骤,开发者可以快速在Spring Boot项目中集成OSS文件上传功能,实现稳定、高效的文件存储解决方案。
如果本文对你有帮助,留下个免费的👍吧~关注我,我们一起走后端学习之路

3505

被折叠的 条评论
为什么被折叠?



