Springboot集成阿里云OSS实现图片上传功能
1.注册阿里云账户,注册完成后实名认证 aliyun.com
2.开通OSS云服务
3.进入阿里云对象存储控制台
4.新建Bucket,权限控制中关闭阻止公共访问
5.配置AccessKey,个人中心创建AccessKey,选择云空间创建,保存好ID和Secret
6.通过配置环境变量完成ID和Secret的配置(可选,如果不配置的话可以在项目代码中配置)
7.回到控制台找到SDK,查看相关语言的JDK文档,项目中引入依赖。
8.复制Demo程序修改相关配置后测试
代码:
使用Java 9及以上版本,需要添加以下JAXB相关依赖。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
# OSS配置 oss: endpoint: https://oss-cn-hangzhou.aliyuncs.com access-key-id: 自己的ID access-key-secret: 自己的secret region: cn-hangzhou bucket-name: bucket的名称
package com.heima.utils; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.InputStream; /** * 阿里云OSS上传工具类 */ @Slf4j @Component public class OssUtils { // OSS配置信息(从配置文件注入) @Value("${oss.endpoint:https://oss-cn-hangzhou.aliyuncs.com}") private String endpoint; @Value("${oss.access-key-id:自己的ID}") private String accessKeyId; @Value("${oss.access-key-secret:自己的secret}") private String accessKeySecret; @Value("${oss.region:cn-hangzhou}") private String region; @Value("${oss.bucket-name:自己的bucket名称}") private String bucketName; /** * 上传文件到OSS * * @param bucketName Bucket名称 * @param objectName Object完整路径(不能包含Bucket名称) * @param inputStream 要上传的文件流 * @return 上传结果,成功返回true,失败返回false */ private boolean uploadFile(String bucketName, String objectName, InputStream inputStream) { if (inputStream == null) { log.error("文件流为空"); return false; } CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret); ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = null; try { // 创建OSSClient实例 ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); // 创建PutObjectRequest对象 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream); // 上传文件 PutObjectResult result = ossClient.putObject(putObjectRequest); log.info("文件上传成功: bucket={}, object={}, requestId={}", bucketName, objectName, result.getRequestId()); return true; } catch (Exception e) { log.error("文件上传失败: bucket={}, object={}", bucketName, objectName, e); return false; } finally { // 释放资源 if (ossClient != null) { ossClient.shutdown(); } } } /** * 上传文件到OSS(带前缀,通过InputStream) * * @param prefix 文件前缀路径(例如:uploads/images/) * @param fileName 文件名 * @param inputStream 要上传的文件流 * @return OSS访问URL,失败返回null */ public String uploadFileWithInputStream(String prefix, String fileName, InputStream inputStream) { if (!prefix.endsWith("/")) { prefix = prefix + "/"; } String objectName = prefix + fileName; boolean success = uploadFile(bucketName, objectName, inputStream); if (success) { return String.format("https://%s.%s/%s", bucketName, endpoint.replace("https://", ""), objectName); } return null; } }
接口调用:
/** * 上传文件到OSS(不保存到服务器) * * @param file 上传的文件 * @return 统一返回结果,包含文件访问URL */ @PostMapping("/fileUpload") public String upload(@RequestParam("fileName") MultipartFile file) throws IOException { log.info("开始上传文件到OSS,文件名:{}", file.getOriginalFilename()); // 获取原始文件名 String originalFilename = file.getOriginalFilename(); // 生成唯一文件名:UUID + 原始文件扩展名 String extension = ""; if (originalFilename != null && originalFilename.contains(".")) { extension = originalFilename.substring(originalFilename.lastIndexOf(".")); } String newFileName = UUID.randomUUID().toString() + extension; try { // 直接通过InputStream上传到OSS,不保存到服务器 String fileUrl = ossUtils.uploadFileWithInputStream( "lkdImgs/", // 前缀路径 newFileName, file.getInputStream() ); if (fileUrl != null) { log.info("文件上传成功,URL:{}", fileUrl); return fileUrl; } else { log.error("文件上传失败"); return "文件上传失败"; } } catch (Exception e) { log.error("文件上传异常", e); return "文件上传失败:" + e.getMessage(); } }

浙公网安备 33010602011771号