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

将文件上传到腾讯云对象存储(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:

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连接失败");
        }
    }

}

  上传文件

/**
     * 上传文件。
     *
     * @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的Metadata
            ObjectMetadata 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;
    }

文件签名及设置过期时间

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;
    }

调用上传方法上传文件

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 硬编码在代码中,建议使用环境变量或配置文件管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣.270. 最接近的二叉搜索树值(中序遍历思想)

文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案&#xff0c;并且要返回最小的那一个&#xff0c;为了解决这个问题&#xff0c;我门则要利用上二叉搜索树中序遍历为有序序列的特性&#xff0c;具体到代码中&a…

高效协同,Tita 助力项目管理场景革新

在当今快节奏、高度竞争的商业环境中&#xff0c;企业面临着前所未有的挑战&#xff1a;如何在有限资源下迅速响应市场变化&#xff0c;确保多个项目的高效执行并达成战略目标&#xff1f;答案就在于优化项目集程管理。而在这个过程中&#xff0c;Tita项目管理产品以其独特的优…

Java使用aspose实现pdf转word

Java使用aspose实现pdf转word 一、下载aspose-pdf-21.6.jar包【下载地址】&#xff0c;存放目录结构如图&#xff1b;配置pom.xml。 <!--pdf to word--> <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId>…

【数据结构-C语言】绪论

文章目录 一、前言二、基本概念和术语2.1 数据元素、数据项和数据对象2.2 数据结构2.2.1 逻辑结构2.2.2 存储结构 2.3 时间复杂度 一、前言 数据结构部分是根据严蔚敏老师的《数据结构-C语言版第2版》书中内容整理的。 二、基本概念和术语 2.1 数据元素、数据项和数据对象 …

anaconda中可以import cv2,但是notebook中cv2 module not found

一、问题 anaconda中成功import cv2 但是jupyter notebook中却无法导入cv2 二、排查 anaconda中使用python路径如下&#xff1a; jupyter notebook中使用python路径如下&#xff1a; 可以发现路径不一致。 三、解决 ①查看可用的kernel ②选中想要修改的kernel&#xff0c;打…

华北平原shp格式范围

华北平原是中国东部的重要地理区域&#xff0c;以下是对其的简要介绍&#xff1a; 此数据为付费数据&#xff0c;如有需求&#xff0c;请联系本人。 1. 地理位置与范围 位置&#xff1a;位于中国东部&#xff0c;西起太行山脉和伏牛山&#xff0c;东至黄海、渤海&#xff0c;北…

MySQL - 字段内分组

1、MySQL 5.7及之前版本 SELECT A.要显示的字段名称,FIRST_VALUE : A.分组字段名称,last :IF(FIRST_VALUE A.分组字段名称, last 1, 1 ) AS rn,FROM 表1 A,(SELECT last : 0, FIRST_VALUE : NULL ) BORDER BY A.排序字段例&#xff1a;SELECT A.DLR_CODE,A.VAILD_CARD_NO,A.L…

【FPGA】 MIPS 12条整数指令 【3】

实现乘除 修改框架 EX&#xff1a;实现带符号乘除法和无符号乘除法 HiLo寄存器&#xff1a;用于存放乘法和除法的运算结果。Hi、Lo为32bit寄存器。电路描述与实现RegFile思想一致 仿真 代码 DataMem.v include "define.v"; module DataMem(input wire clk,input…

电路笔记(电源模块): 直流双路输出电源输出正负5伏电压

实现方法 以E3620A直流电源为例&#xff0c;调节两个电源的电压&#xff0c;并正负短接&#xff1a; 原理 图片来源&#xff1a;https://2.eewimg.cn/mp/uploads/2022/09/13/f6f96c1c-333c-11ed-b203-00163e2e672a.jpg CG 【产品】50W最大工作功率&#xff0c;1A/25V高精度…

深入浅出:机器学习的全面解析

深入浅出&#xff1a;机器学习的全面解析 引言 机器学习&#xff08;Machine Learning, ML&#xff09;作为人工智能的一个重要分支&#xff0c;近年来取得了显著进展&#xff0c;并在多个领域中得到了广泛应用。本文将从基础概念、核心算法、应用场景以及未来发展趋势等方面…

【玩转全栈】--创建一个自己的vue项目

目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架&#xff0c;旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念&#xff0c;使得开发者可以通过声明式的方式轻松管理数据和…

Mysql知识梳理(数据库的锁梳理,Mysql优化)

Mysql知识梳理 Mysql构成存储引擎 Mysql隐藏知识mysql中的日志Redo LogRedo Log 的特性&#xff1a;Redo Log 与 Binlog 的区别&#xff1a; undo 的工作Undo Log 的工作原理&#xff1a;Undo Log 的特性&#xff1a;Undo Log 的作用&#xff1a; Undo Log 与 Redo Log 的区别&…

地平线 3D 目标检测 Bevformer 参考算法-V2.0

该示例为参考算法&#xff0c;仅作为在 征程 6 上模型部署的设计参考&#xff0c;非量产算法 简介 BEVFormer 是当前热门的自动驾驶系统中的 3D 视觉感知任务模型。BEVFormer 是一个端到端的框架&#xff0c;BEVFormer 可以直接从原始图像数据生成 BEV 特征&#xff0c;无需依…

Deepseek 【大模型】之 Ollama 与 Ollama Web UI Lite 本地部署 Deepseek 可视化UI 访问模型的简单整理

Deepseek 【大模型】之 Ollama 与 Ollama Web UI Lite 本地部署 Deepseek 可视化UI 访问模型的简单整理 目录 Deepseek 【大模型】之 Ollama 与 Ollama Web UI Lite 本地部署 Deepseek 可视化UI 访问模型部署简单整理 一、简单介绍 二、 Ollama 下载安装 三、Ollama 下载 LLM…

Excel 融合 deepseek

效果展示 代码实现 Function QhBaiDuYunAIReq(question, _Optional Authorization "your api key", _Optional Qhurl "https://qianfan.baidubce.com/v2/chat/completions")Dim XMLHTTP As ObjectDim url As Stringurl Qhurl 这里替换为你实际的URLDim …

SpringBoot开发(六)SpringBoot整合MyBatis

1. SpringBoot整合MyBatis 1.1. MyBatis介绍 MyBatis 是一款优秀的持久层Dao框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c…

[数据结构] Set的使用与注意事项

目录 Set的说明 常见方法说明 注意事项 TreeSet使用案例 Set的说明 Set与Map主要的不同有两点: Set是继承自Collection的接口类,Set中只存储了Key. 常见方法说明 方法解释boolean add(E e)添加元素,但重复元素不会被添加成功void clear()清空集合boolean contains(Object…

JumpServer堡垒机管理服务器与数据库资产

第一次接触JumpServer是一位老师借给我的&#xff0c;当时想部署oceanbase 企业版V3 &#xff0c;苦于笔记本内存太小&#xff0c;后来在JumpServer上部署成功了&#xff0c;后来一直对JumpServer比较感兴趣&#xff0c;年后有时间对JumpServer进行了系统的学习 一.使用场景 我…

汽车免拆诊断案例 | 2015款奔驰R320车行驶中偶尔多个故障灯异常点亮

故障现象  一辆2015款奔驰R320车&#xff0c;搭载276 826 发动机&#xff0c;累计行驶里程约为18万km。该车行驶中&#xff0c;组合仪表上的ABS警告灯、防侧滑警告灯、发动机故障灯等多个故障灯偶尔异常点亮&#xff08;图1&#xff09;&#xff0c;且车速表不指示&#xff0…

实验3 词法分析(二)

实验3 词法分析(二) [实验目的]&#xff1a; 1 . 熟悉给定的词法分析程序&#xff1b; 2 . 改进词法分析程序。 [实验内容]&#xff1a; 1.尝试多方面改进TEST语言的文法&#xff0c;参考教材附录B词法分析程序TESTscan.c&#xff0c;在此词法分析程序的基础上改进程序&#x…