news 2026/5/19 9:04:34

阿里云OSS文件上传案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
阿里云OSS文件上传案例

OSS 文件上传流程详解

以下是基于提供代码实现的 OSS 文件上传完整流程,包含配置、核心代码及步骤说明:

一、前期准备
  1. 阿里云 OSS 配置
    • 需在阿里云控制台创建 Bucket,获取endpointaccessKeyIdaccessKeySecretbucketName
    • 配置文件位置:src/main/resources/oss.properties

properties

# oss.properties配置示例 aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com aliyun.oss.accessKeyId=LTAI5tGRHc12i6A4ZEnrUaRR aliyun.oss.accessKeySecret=EEeB0vBuvmDlXK1fkX2cBMWcsztlx0 aliyun.oss.bucketName=zjc-java-spring
二、核心组件配置
  1. OSS 客户端配置(OssConfig.java)

java

运行

@Configuration public class OssConfig { // 从配置文件注入OSS连接参数 @Value("${aliyun.oss.endpoint}") private String endpoint; @Value("${aliyun.oss.accessKeyId}") private String accessKeyId; @Value("${aliyun.oss.accessKeySecret}") private String accessKeySecret; // 创建OSS客户端实例并交给Spring管理 @Bean(destroyMethod = "shutdown") public OSS ossClient() { return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); } }
  1. 文件上传工具类(OssUtils.java)

java

运行

@Component public class OssUtils { @Autowired private OSS ossClient; @Value("${aliyun.oss.bucketName}") private String bucketName; @Value("${aliyun.oss.endpoint}") private String endpoint; /** * 文件上传到OSS * @param file 要上传的文件 * @param folder OSS存储文件夹 * @return 外网访问URL */ public String upload(MultipartFile file, String folder) throws Exception { // 1. 校验文件是否为空 if (file.isEmpty()) { throw new Exception("上传文件不能为空"); } // 2. 处理文件名和后缀 String originalFilename = file.getOriginalFilename(); String suffix = ""; if (originalFilename != null && originalFilename.contains(".")) { suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); } String fileName = originalFilename; // 使用原始文件名 // 3. 处理文件夹路径 if (!folder.endsWith("/")) { folder += "/"; } String objectName = folder + fileName; // 最终OSS存储路径 // 4. 上传文件到OSS InputStream inputStream = file.getInputStream(); try { ossClient.putObject(bucketName, objectName, inputStream); } finally { inputStream.close(); // 确保流关闭 } // 5. 构建文件访问URL String endpointWithoutProtocol = endpoint.replaceFirst("^https?://", ""); return "https://" + bucketName + "." + endpointWithoutProtocol + "/" + objectName; } }
三、业务层实现
  1. 服务接口(FileService.java)

java

运行

public interface FileService { // 上传文件并返回文件信息 File uploadFile(MultipartFile file, String fileName); }
  1. 服务实现类(FileServiceImpl.java)

java

运行

@Service public class FileServiceImpl implements FileService { @Autowired private FileMapper fileMapper; @Autowired private OssUtils ossUtils; @Override public File uploadFile(MultipartFile file, String fileName) { try { // 1. 上传文件到OSS,指定存储文件夹 String folder = "file/"; String fileUrl = ossUtils.upload(file, folder); // 2. 构建文件实体对象 File fileEntity = new File(); fileEntity.setName(fileName); fileEntity.setUrl(fileUrl); // 提取文件标识(用于后续删除) String keyPoints = fileUrl.substring(fileUrl.lastIndexOf("/") + 1); fileEntity.setKeyPoints(keyPoints); // 3. 保存文件信息到数据库 fileMapper.insert(fileEntity); return fileEntity; } catch (Exception e) { throw new RuntimeException("文件上传失败:" + e.getMessage()); } } }
四、控制器层(接收前端请求)

java

运行

@Controller @RequestMapping("/file") public class FileController { @Autowired private FileService fileService; @PostMapping("/upload") @ResponseBody public Map<String, Object> upload( @RequestParam("file") MultipartFile file, @RequestParam("fileName") String fileName) { Map<String, Object> result = new HashMap<>(); try { // 1. 校验参数 if (file == null || file.isEmpty()) { result.put("success", false); result.put("message", "请选择文件"); return result; } // 2. 调用服务层上传 File fileEntity = fileService.uploadFile(file, fileName); // 3. 返回结果 result.put("success", true); result.put("data", fileEntity); result.put("message", "上传成功"); } catch (Exception e) { result.put("success", false); result.put("message", "上传失败:" + e.getMessage()); } return result; } }
五、SpringMVC 文件上传配置

springmvc.xml中配置文件上传解析器:

xml

<!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 最大10MB --> <property name="defaultEncoding" value="UTF-8"/> </bean>
六、完整上传流程总结
  1. 前端请求:通过表单或 AJAX 提交MultipartFile文件和文件名
  2. 参数校验:控制器检查文件是否为空、文件名是否存在
  3. OSS 上传
    • 工具类处理文件路径和名称
    • 通过 OSS 客户端将文件流上传到指定 Bucket
    • 生成外网可访问的文件 URL
  4. 数据持久化
    • 将文件 URL、名称、标识等信息存入数据库
    • 返回包含文件信息的成功响应
  5. 异常处理:任何环节出错时返回错误信息
七、关键注意点
  1. 确保 OSS Bucket 的访问权限设置正确(通常为公共读)
  2. 生产环境中应使用 UUID 生成唯一文件名,避免重名覆盖
  3. 大文件上传建议分块上传(需额外实现)
  4. 记得在项目关闭时关闭 OSS 客户端连接(已通过@PreDestroy实现)
  5. 实际部署时需替换为自己的 OSS 密钥信息,避免泄露
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 4:08:53

为什么90%的量子程序调试失败?根源藏在VSCode连接日志里?

第一章&#xff1a;为什么90%的量子程序调试失败&#xff1f;量子程序调试的高失败率源于其与经典计算范式的根本差异。传统调试工具无法直接观测量子态而不破坏叠加性&#xff0c;导致常见的断点和日志输出手段失效。量子态不可克隆的限制 根据量子力学中的“不可克隆定理”&a…

作者头像 李华
网站建设 2026/5/15 11:48:50

内核级Root隐藏技术深度解析:SUSFS4KSU架构设计与实战指南

内核级Root隐藏技术深度解析&#xff1a;SUSFS4KSU架构设计与实战指南 【免费下载链接】susfs4ksu-module An addon root hiding service for KernelSU 项目地址: https://gitcode.com/gh_mirrors/su/susfs4ksu-module 技术痛点&#xff1a;为什么传统Root隐藏方案频频失…

作者头像 李华
网站建设 2026/5/16 21:34:15

棕榈酰二肽-5 / SYN-Tacks轮廓重塑,紧致上扬794590-34-4

棕榈酰二肽-5 / SYN-Tacks —— 改写肌肤「时区」的精密信号&#xff0c;重塑年轻轮廓的隐形架构 在抗衰老护肤的尖端领域&#xff0c;真正的突破往往源自对肌肤底层“语言”的精准解读与响应。今天&#xff0c;我们向您隆重介绍一位超越表层护理的「细胞指令官」——棕榈酰二肽…

作者头像 李华
网站建设 2026/5/16 15:56:56

高效实战:5种SHAP可视化方法深度解析机器学习模型

在机器学习模型日益复杂的今天&#xff0c;模型的可解释性已成为确保AI系统可靠性的关键要素。SHAP&#xff08;SHapley Additive exPlanations&#xff09;作为基于合作理论的模型解释框架&#xff0c;为数据科学家提供了打开模型黑盒的钥匙。本文将从实际问题出发&#xff0c…

作者头像 李华
网站建设 2026/5/3 10:31:57

IDM无限试用重置工具:数字时代下载管理终极解决方案

在数字内容爆炸式增长的今天&#xff0c;下载管理已成为每个互联网用户的必备技能。面对IDM这款下载利器&#xff0c;许多用户却因30天试用期的限制而苦恼。今天&#xff0c;我们将深入探讨一款革命性的工具——IDM试用管理工具&#xff0c;它能为你带来前所未有的下载体验优化…

作者头像 李华
网站建设 2026/5/16 12:11:54

玩转B站数据:Python API开发实战指南

玩转B站数据&#xff1a;Python API开发实战指南 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址&#xff1a;https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-…

作者头像 李华