文件上传到腾讯云存储、签名及设置过期时间

embedded/2025/2/12 17:41:40/

将文件上传到腾讯云对象存储(COS,Cloud Object Storage)可以通过腾讯云提供的 SDK 实现。以下是详细的步骤和示例代码,帮助您完成文件上传操作。


步骤

  1. 注册腾讯云账号并创建存储桶

    (1)登录腾讯云控制台,进入 对象存储 COS。(2)创建一个存储桶(Bucket),并获取存储桶的名称和所属地域(Region)。
  2. 获取 API 密钥

    腾讯云控制台的 访问管理 中,获取您的 SecretId 和 SecretKey
  3. 添加腾讯云 COS SDK 依赖

    在项目中引入腾讯云 COS 的 Java SDK。
  4. 编写 Java 代码上传文件

    使用 SDK 提供的 API 上传文件到腾讯云 COS。

依赖库

在 Maven 项目pom.xml添加以下依赖:

<dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.89</version>
</dependency>

示例代码

以下是一个完整的 Java 示例代码,演示如何将本地文件上传到腾讯云 COS:

java">import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.region.Region;
import lombok.extern.slf4j.Slf4j;/*** 腾讯cos文件上传工具类**/
@Slf4j
public class TencentCOSUtil {//创建链接public static COSClient getCOSClient() {try {// 1. 初始化用户身份信息(SecretId 和 SecretKey)String accessKey = "your accessKey";String secretKey = "your secretKey";COSCredentials cred = new BasicCOSCredentials(accessKey, secretKey);// 2. 设置存储桶的地域Region region = new Region("ap-guangzhou");ClientConfig clientConfig = new ClientConfig(region);// 创建COClient实例。return new COSClient(cred, clientConfig);} catch (Exception e) {throw new BusinessException("创建腾讯云OSS连接失败");}}}

  上传文件

java">/*** 上传文件。** @param inputStream 以流的方式上传文件* @param path        上传的文件存放路径* @param fileName    指定的文件名* @param suffix      上传的文件后缀* @return 文件在服务器上的全路径*/public static String upLoad(InputStream inputStream, String path, String fileName, String suffix, boolean signFlag) {if (inputStream == null) {return null;}String bucketName = "your bucketName";String endpoint = "your endpoint";String fileUrl = null;// 文件名格式SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.PURE_DATETIME_PATTERN);String newFileName = null;if (StrUtil.isNotBlank(fileName)) {newFileName = fileName + RandomUtil.randomString(5) + "." + suffix;} else {newFileName = sdf.format(new Date()) + RandomUtil.randomString(5) + "." + suffix;}String filePath = path + "/" + newFileName;fileUrl = endpoint + "/" + filePath;COSClient cosClient = getCOSClient();try {// 创建上传Object的MetadataObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setCacheControl("no-cache");objectMetadata.setHeader("Pragma", "no-cache");// 上传文件PutObjectResult putResult = cosClient.putObject(bucketName, filePath, inputStream, objectMetadata);if (putResult != null) {fileUrl = signFlag ? generatePresignedUrl(cosClient, fileUrl) : fileUrl;}} catch (CosClientException oe) {log.error(oe.getMessage());throw oe;} finally {cosClient.shutdown();}log.info("[cosUpLoad]文件全路径fileUrl={}", fileUrl);return fileUrl;}

文件签名及设置过期时间

java">public static String generatePresignedUrl(COSClient cosClient, String fileUrl) {String bucketName="your bucketName";if (StrUtil.isBlankIfStr(fileUrl)) {return fileUrl;}if (cosClient == null) {cosClient = getCOSClient();}// 设置URL过期时间Date expiration = DateUtil.offsetMinute(new Date(), 3);try {String filePath = new URL(fileUrl).getPath().substring(1);filePath = URLDecoder.decode(filePath, "UTF-8");// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。URL url = cosClient.generatePresignedUrl(bucketName, filePath, expiration);return url.toString();} catch (CosClientException ce) {log.error("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with COS, "+ "such as not being able to access the network.");log.error("Error Message:" + ce.getMessage());} catch (MalformedURLException e) {log.error("[cosSignedUrl]文件地址格式有误", e);} catch (UnsupportedEncodingException e) {log.error("[cosSignedUrl]中文文件地址转换异常", e);} finally {if (cosClient != null) {cosClient.shutdown();}}return null;}

调用上传方法上传文件

java">public static void main(String[] args) {//从数据库查询业务数据List<UserData> projectList = new ArrayList<>();ByteArrayOutputStream out = new ByteArrayOutputStream();EasyExcel.write(out, UserData.class).sheet(0).doWrite(projectList);String fileUrl = null;try {fileUrl = TencentCOSUtil.upLoad(new ByteArrayInputStream(out.toByteArray()),"userData" + "/" + DateUtil.format(new Date(), "yyyy-MM"),"用户信息","xlsx", true);} catch (Exception e) {log.error("[userData]导出失败:", e);} finally {if (out != null) {try {out.close();} catch (IOException e) {log.error("[userData]关闭流失败", e);}}}if (fileUrl != null) {log.info("导出成功,文件fileUrl={}",fileUrl);}log.info("导出失败,文件fileUrl={}",fileUrl);}

代码说明

  1. 初始化身份信息

    使用 SecretId 和 SecretKey 创建 COSCredentials 对象。
  2. 设置存储桶地域

    根据存储桶的地域(如 ap-beijing)创建 ClientConfig 对象。
  3. 创建 COSClient

    使用 COSCredentials 和 ClientConfig 创建 COSClient 实例。
  4. 上传文件

    指定存储桶名称、本地文件路径和文件在 COS 上的存储路径(Key)。使用 PutObjectRequest 创建上传请求,并调用 cosClient.putObject() 方法上传文件。
  5. 关闭 COSClient

    上传完成后,调用 cosClient.shutdown() 关闭客户端。

关键参数

  • SecretId 和 SecretKey腾讯云 API 密钥,用于身份验证。

  • BucketName:存储桶名称,格式为 <BucketName-APPID>,例如 examplebucket-1250000000

  • Region:存储桶所在地域,例如 ap-beijing(北京)。

  • Key:文件在 COS 上的存储路径,例如 uploads/file.txt


注意事项

  1. 权限设置

    (1)确保存储桶的权限设置为允许上传。(2)如果需要公开访问,可以设置文件的访问权限为公共读。
  2. 文件大小限制

    单个文件上传最大支持 5 TB。如果文件较大,建议使用分块上传(SDK 也支持分块上传 API)。
  3. 安全性

    不要将 SecretId 和 SecretKey 硬编码在代码中,建议使用环境变量或配置文件管理。

http://www.ppmy.cn/embedded/161112.html

相关文章

互联网企业线上业务拓展与开源AI智能名片2+1链动模式S2B2C商城小程序的创新应用

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;互联网企业不断探索线上业务的边界&#xff0c;寻求新的增长动力。在互联网初期&#xff0c;面对商业模式和盈利模式的不成熟&#xff0c;国内互联网企业多从借鉴国外成功经验起步&#xff0c;逐步摸索出适合本土市场的线…

从零开始了解人工智能:核心概念、GPT及 DeepSeek 探索

从零开始了解人工智能:核心概念、GPT及 DeepSeek 探索 适用人群:对人工智能感兴趣、想从基础概念入手的同学;有一点编程基础但尚不了解大模型与 GPT 技术原理的程序员;想追踪 AI 热点并寻找实战参考的学习者。 一、什么是人工智能? 人工智能(Artificial Intelligence)是…

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们&#xff01;好久不见&#xff01; 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章&#xff1a; 周易六十四卦 掐指一算——小六壬 更多优质文章&#xff1a;个人主页 JAVA系列&#xff1a;JAVA 大佬们互三哦~互三必回&#xff01;&#xf…

测试驱动开发(TDD)

你将能够定义测试驱动开发&#xff08;TDD&#xff09;&#xff0c;描述 TDD 如何产出更高质量的代码&#xff0c;阐述 “红、绿、重构” 工作流程&#xff0c;以及说明 TDD 对 DevOps 的重要性。 这是我最喜欢的名言之一&#xff1a;“如果某件事值得去构建&#xff0c;那它就…

艾蒿染色体水平基因组-文献精读111

A chromosome-scale genome assembly of Artemisia argyi reveals unbiased subgenome evolution and key contributions of gene duplication to volatile terpenoid diversity 一项关于艾蒿&#xff08;Artemisia argyi&#xff09;的染色体尺度基因组组装揭示了无偏的亚基因…

kafka服务端之分区管理

文章目录 概述优先副本选举为何要有优先副本优先副本选举弊端如何开启优先副本选举如何开启部分优先副本选举如何正确使用优先副本选举 分区重分配为何需要分区重分配分区重分配工作原理分区重分配弊端及其如何正确使用 复制限流为何需要复制限流如何进行复制限流 修改副本因子…

2.9学习总结

作业剩下的题属于是心有余而力不足了&#xff0c;今天主要复习了这周学过的内容&#xff0c;了解了数据结构&#xff08;不是很懂&#xff09;&#xff0c;因为之前刷的都是作业中的题嘛&#xff0c;其他类型的题就不是很会做&#xff0c;所以我就在洛谷踢单里面刷了一点题目&a…

【LLM】o1/R1系列LLM数据篇

关于思维链推理的10开源数据集&#xff1a; 目前开源的数据主要有如下&#xff1a; 1、Magpie-Reasoning-V2数据集&#xff0c;其中包含DeepSeek-R1生成的250K思路链推理样本&#xff0c;这些示例涵盖了数学推理、编码和一般问题解决等各种任务。https://huggingface.co/datas…