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

阿里云文件上传oss存储

文档地址

https://help.aliyun.com/zh/oss/object-file-object/

创建存储空间(Bucket)

https://oss.console.aliyun.com/bucket

出于安全考虑,OSS 控制台默认开启阻止公共访问,仅支持创建私有权限的Bucket。

如需改为 公共读 或 公共读写,请按以下步骤操作:

  1. 单击目标Bucket名称进入该Bucket。

  2. 在左侧导航栏选择 权限控制 > 阻止公共访问,关闭该策略。

  3. 切换至 读写权限 页签,单击 设置。

  4. 按引导修改 Bucket 的读写权限为公共读或公共读写。

引入sdk

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加以下JAXB相关依赖。
<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>

java代码

@Slf4j
public class OssFileUploaderUtil {private static final String accessKeyId = "xxxxxxx";private static final String accessKeySecret = "xxxxxxxxx";// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。private static final String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";private static final String bucketName = "work";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。private static final String region = "cn-hangzhou";private final boolean isPublicBucket = false; // 是否为公开Bucket(影响下载链接生成方式)/*** 上传字节流到OSS并返回下载链接* @param fileBytes 文件字节数组(如Excel模板的字节流)* @param fileName 文件名(含扩展名,如:用户模板_20250910.xlsx)* @param fileDir OSS存储目录(如:user/templates/,末尾需带斜杠)* @param contentType 文件MIME类型(如:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)* @return 可直接访问的下载链接* @throws IOException 流处理异常*/public static String upload(byte[] fileBytes, String fileName, String fileDir, String contentType) throws IOException {// 1. 构建OSS文件完整路径(目录+文件名)String objectPath = fileDir + fileName;log.info("开始上传文件到OSS,路径:{}", objectPath);OSS ossClient = null;ByteArrayInputStream inputStream = null;try {// 2. 初始化OSS客户端DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);ClientBuilderConfiguration clientConfig = new ClientBuilderConfiguration();clientConfig.setSignatureVersion(SignVersion.V4); // 使用V4签名算法ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialProvider).clientConfiguration(clientConfig).region(region).build();// 3. 配置文件元数据ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType(contentType); // 关键:指定文件类型,避免下载异常metadata.setContentLength(fileBytes.length); // 设置文件大小metadata.setContentEncoding("UTF-8");// 4. 上传文件流inputStream = new ByteArrayInputStream(fileBytes);PutObjectRequest putRequest = new PutObjectRequest(bucketName, objectPath, inputStream, metadata);ossClient.putObject(putRequest);log.info("文件上传OSS成功,路径:{}", objectPath);// 5. 生成下载链接return generateDownloadUrl(objectPath);} catch (OSSException e) {log.error("OSS上传失败!错误码:{},请求ID:{}", e.getErrorCode(), e.getRequestId(), e);throw new RuntimeException("文件上传OSS失败:" + e.getMessage(), e);} finally {// 6. 释放资源if (inputStream != null) {inputStream.close();}if (ossClient != null) {ossClient.shutdown();}}}/*** 生成文件下载链接* @param objectPath OSS上的文件完整路径(如:user/templates/用户模板.xlsx)* @return 下载链接(公开Bucket返回永久链接,私有Bucket返回带签名的临时链接)*/private static String generateDownloadUrl(String objectPath) {try {// 编码文件名(处理中文/特殊字符)String encodedPath = URLEncoder.encode(objectPath, StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");            if (isPublicBucket) {// 公开Bucket:直接拼接HTTP URLString endpointHost = endpoint.replace("https://", "");String fileUrl = String.format("https://%s.%s/%s", bucketName, endpointHost, encodedPath);log.info("文件地址:{}", fileUrl);return fileUrl;
            } else {
                // 私有Bucket:生成带签名的临时URL(有效期1小时)
                Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
                return ossClient.generatePresignedUrl(bucketName, objectPath, expiration).toString();
            }} catch (Exception e) {log.error("生成下载链接失败", e);throw new RuntimeException("生成文件下载链接失败", e);}}}

 

http://www.rkmt.cn/news/924.html

相关文章:

  • AT_agc014_f [AGC014F] Strange Sorting
  • 智能充气泵PCBA方案
  • 数字设计中的多级同步器(multi-stage synchronizer)
  • C++容器内存安全实战:ASan注解逐步指南
  • iOS系统与Windows系统有什么区别?
  • OSI 七层协议 和四层协议 TCP 三次握手的过程
  • 3. pod的生命周期
  • 2. pod基础原理
  • MySQL存储过程
  • ARC058D 笔记
  • SSE技术总结
  • OCP、OMSP 和 OLP 是三种常见的光层保护机制的对比
  • 自从切到Qoder开发后,每天都心旷神怡
  • 电子烟的4种屏幕驱动集成语音方案介绍
  • Altair PSIM 2024下载地址与安装教程
  • CF643E Bear and Destroying Subtrees
  • Go语言系统信息获取示例
  • OpenCSG 哈投达成战略合作,加速东北企业AI转型
  • 收录笔记:蜘蛛池,蜘蛛池出租 - 蚂蚁站群
  • 核心漏洞开发实战:Win32漏洞挖掘与防护绕过深度解析
  • Karmada v1.15 版本发布!多模板工作负载资源感知能力增强
  • 使用JavaScript开发谷歌浏览器插件:实现与核心要点
  • 自动化SEO工具:黑帽站群软件 - 蚂蚁站群
  • openssl编程之hmac算法编程示例
  • c#项目迁移至Kubernetes之NTLM认证问题解决方案
  • AI写代码
  • 蚂蚁超级镜像站群搜索:多站搭建教程,提升排名实战手记 - 蚂蚁站群
  • 易基因:安医大陈飞虎团队揭示METTL3介导m6A甲基化在炎症性疾病发病机制中的表观调控作用:IJBM|项目文章
  • 一键批量镜像站群的软件,多任务不费时 - 蚂蚁站群
  • Year of the Rabbit – TryHackMe