当前位置: 首页 > 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的基本文件操作。

http://www.xdnf.cn/news/327007.html

相关文章:

  • 云上玩转Qwen3系列之二:PAI-LangStudio搭建联网搜索和RAG增强问答应用
  • C++初阶 —— 类和对象
  • C++ 中的 `it->second` 和 `it.second`:迭代器与对象访问的微妙区别
  • 如何延长电脑使用寿命?
  • Cadence 高速系统设计流程及工具使用二
  • 学习黑客 Linux用户管理
  • Linux理解文件fd
  • 热部署相关
  • 说说es配置项的动态静态之分和集群配置更新API
  • Filecoin矿工资金管理指南:使用lotus-shed actor withdraw工具
  • Kubernetes学习笔记
  • 浅谈图像分割中预测图与标签图的对应关系
  • C++面向对象设计类的核心知识详解总述(1)
  • Spring 与 MyBatis 整合时的事务管理细节
  • 如何使用docker配置ros-noetic环境并使用rviz,gazebo
  • Nvidia-smi 运行失败(Failed to initialize NVML: Driver/library version mismatch)
  • Elasticsearch 8.x 在 java 中的使用情况
  • MIT关节电机相序校准
  • upload-labs靶场通关详解:第二关
  • 绕线机的制作与研究
  • very_easy_sql(SSRF+SQL注入)
  • 配置指定地址的conda虚拟Python环境
  • gitcode 上传文件报错文件太大has exceeded the limited size (10 MiB) in commit
  • dragonfly Prometheus 没有监控指标 dragonfly_scheduler_host_traffic
  • 益鑫通连接器车规级,非车规可替代JST,MOLEX
  • Keil安装pack包时报错解决:Cannot copy license file to “.Download“ folder.
  • string--OJ3
  • 基于Django框架开发的B2C天天生鲜电商平台
  • 306.检查是否所有A都在B之前
  • 通用分布式锁组件