当前位置: 首页 > news >正文

springboot使用阿里云OSS实现文件上传

在Spring Boot中集成阿里云OSS(对象存储服务)可以通过以下步骤实现:


  1. 添加Maven依赖
    pom.xml中添加阿里云OSS SDK依赖:
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.16.1</version>
</dependency>

  1. 配置阿里云OSS参数
    application.ymlapplication.properties中配置OSS参数:
aliyun:oss:endpoint: oss-cn-hangzhou.aliyuncs.com  # 根据实际填写(注意这个地方,不要带包名)access-key-id: your-access-key-idaccess-key-secret: your-access-key-secretbucket-name: your-bucket-name

  1. 创建OSS配置类
    创建OSSConfig类读取配置并初始化OSSClient
@Configuration
public class OSSConfig {@Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.access-key-id}")private String accessKeyId;@Value("${aliyun.oss.access-key-secret}")private String accessKeySecret;@Beanpublic OSS ossClient() {return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}
}

  1. 实现OSS服务工具类
    创建AliOssUtil类封装上传、下载等方法:
@Component
@Slf4j
public class AliOssUtil {private final AliOssConfig aliOssConfig;private OSS ossClient;@Autowiredpublic AliOssUtil(AliOssConfig aliOssConfig) {this.aliOssConfig = aliOssConfig;ossClient = new OSSClientBuilder().build(aliOssConfig.getEndpoint(), aliOssConfig.getAccessKeyId(), aliOssConfig.getAccessKeySecret());}public String uploadFile(MultipartFile file) {if (file.isEmpty()) {throw new IllegalArgumentException("文件不能为空");}try {// 生成文件名和路径String fileName = generateUniqueFileName(file.getOriginalFilename());String filePath = generateDateBasedFilePath(fileName);// 上传文件try (InputStream inputStream = file.getInputStream()) {ossClient.putObject(aliOssConfig.getBucketName(), filePath, inputStream);}// 返回 URLreturn buildOssUrl(filePath);} catch (IOException e) {throw new RuntimeException("文件读取失败: " + e.getMessage());} catch (OSSException | ClientException e) {throw new RuntimeException("OSS服务异常: " + e.getMessage());}}/*** 生成唯一文件名(UUID + 扩展名)*/private String generateUniqueFileName(String originalFilename) {String extension = getFileExtension(originalFilename);return UUID.randomUUID() + extension;}/*** 提取文件扩展名(处理无扩展名的情况)*/private String getFileExtension(String originalFilename) {if (originalFilename == null) return ".dat";int lastDotIndex = originalFilename.lastIndexOf(".");return (lastDotIndex == -1) ? ".dat" : originalFilename.substring(lastDotIndex);}/*** 生成基于日期的存储路径(如 images/2024/06/15/uuid.jpg)*/private String generateDateBasedFilePath(String fileName) {String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));return String.format("images/%s/%s", datePath, fileName);}/*** 构建 OSS 访问 URL*/private String buildOssUrl(String filePath) {return String.format("https://%s.%s/%s",aliOssConfig.getBucketName(),aliOssConfig.getEndpoint(),filePath);}/*** 删除文件*/public void deleteFile(String filePath) {ossClient.deleteObject(aliOssConfig.getBucketName(), filePath);}
}    

  1. 创建Controller测试接口
@RestController
@RequestMapping("/oss")
public class OSSController {@Autowiredprivate OSSService ossService;@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {try {return ossService.uploadFile(file);} catch (IOException e) {return "上传失败: " + e.getMessage();}}@DeleteMapping("/delete")public String delete(@RequestParam String filePath) {ossService.deleteFile(filePath);return "删除成功";}
}

  1. 注意事项
  2. 权限管理:确保Bucket的读写权限(ACL)设置为允许当前操作。
  3. 异常处理:建议对OSS操作添加try-catch,处理网络异常或认证失败等情况。
  4. 客户端关闭:在Spring Bean生命周期结束时关闭OSSClient(需在配置类中添加@PreDestroy方法)。
  5. 文件名唯一性:建议使用UUID或时间戳生成唯一文件名,避免覆盖。

  1. 扩展功能
    • 分片上传:使用ossClient.initiateMultipartUpload处理大文件分片上传。

• STS临时凭证:通过STS服务获取临时Token,提升安全性。

• CDN加速:如果启用了CDN,可直接返回CDN域名而非OSS域名。


通过以上步骤,即可在Spring Boot中实现阿里云OSS的基本文件操作。

相关文章:

  • 如何理解k8s中的controller
  • 技术视界 | 青龙机器人训练地形详解(一):如何创建一个地形
  • 探索 C++ 语言标准演进:从 C++23 到 C++26 的飞跃
  • 【FreeRTOS-消息队列】
  • 阿里云服务器-centos部署定时同步数据库数据-dbswitch
  • Microsoft Azure 在印度尼西亚区域正式上线
  • 三菱 FX 系列 PLC 转网口模块SG-FX-210
  • 英伟达开源Llama-Nemotron系列模型:14万H100小时训练细节全解析
  • centos8.5.2111安装python3.11.12
  • 华为昇腾在智慧矿山机器人的应用及其技术解决方案
  • Milvus(16):索引解释
  • ROS-仿真实验平台
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.1 基础图表绘制(折线图/柱状图/散点图)
  • 手动写一个vuex的可持续化插件
  • html css js网页制作成品——HTML+CSS珠海网页设计网页设计(4页)附源码
  • 基于RT-Thread的STM32G4开发第二讲第二篇——ADC
  • MCU怎么运行深度学习模型
  • TB6600HG是一款PWM(脉宽调制)斩波型单芯片双极性正弦波微步进电机驱动集成电路。
  • 如何让大脑 保持长时间清醒状态
  • 阿维塔汽车CAN总线数据适配技术解析与免破线数据采集实践
  • 欧盟公布对美关税反制清单,瞄准美国飞机等产品
  • 绍兴柯桥:用一块布托起中国制造的新经纬
  • 黄晨光任中科院空间应用工程与技术中心党委书记、副主任
  • 上海营商环境的“分寸”感:底线之上不断拓宽自由,底线之下雷霆制止
  • 正荣地产:公司控股股东已获委任联合清盘人
  • 潘功胜:央行将创设科技创新债券风险分担工具