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

news/2025/2/9 2:34:52 标签: 腾讯云, java

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

文件签名及设置过期时间

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.niftyadmin.cn/n/5845460.html

相关文章

MAC OS安装Homebrew

文章目录 1.下载Homebrew2.完成安装3.验证安装4.更新 Homebrew作为一个包管理器&#xff0c;提供了一种简便的方式来安装、更新和卸载各种命令行工具和应用程序。相比于手动下载和编译源代码&#xff0c;或者从不同的网站下载安装包&#xff0c;使用Homebrew可以显著减少这些操…

采用idea中的HTTP Client插件测试

1.安装插件 采用idea中的HTTP Client插件进行接口测试,好处是不用打开post/swagger等多个软件,并且可以保存测试时的参数,方便后续继续使用. 高版本(2020版本以上)的idea一般都自带这个插件,如果没有也可以单独安装. 2.使用 插件安装完成(或者如果idea自带插件),会在每个Con…

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面&#xff0c;我们可以通过在项目文件夹上点击鼠标右键&#xff0c;选择“New”菜单下的“Python File”来创建一个 Python 文件&#xff0c;在给文件命名时建议使用英文字母和下划线的组合&#xff0c;创建好的 Python 文件会自动打开&#…

ctf网络安全题库 ctf网络安全大赛答案

此题解仅为部分题解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…

蓝桥杯备赛——进制转化相关问题

目录 一、基础概念 二、问题研究&#xff08;1&#xff09; 代码解读&#xff1a; 1. transfer 函数 代码功能概述 详细步骤 2. main 函数 代码功能概述 详细步骤 三、运用递归解决 &#xff08;一&#xff09; 代码如下&#xff1a; 代码解读&#xff1a; &#…

大模型deepseek-r1 本地Open WebUI部署详解

一、Open WebUI简介 Open WebUI是一个用户友好的Web界面&#xff0c;专为本地大语言模型&#xff08;LLMs&#xff09;设计。它支持多种模型&#xff0c;包括Ollama和OpenAI兼容的API&#xff0c;并允许用户通过图形界面轻松调试和调用模型。Open WebUI的功能丰富&#xff0c;…

.NET Framework和.NET Core的区别

.NET Framework和.NET Core的区别&#xff0c;这需要我来详细解释一下。首先&#xff0c;我得回忆一下两者的基本信息&#xff0c;它们的发布时间、设计目的&#xff0c;还有各自的特点。 首先&#xff0c;.NET Framework是微软早期推出的&#xff0c;主要用于Windows平台的应用…

【深度学习】关于模型训练的一些基本概念

基本概念 泛化能力 指模型离开训练集后&#xff0c;在测试集&#xff08;任意其他数据集&#xff09;上的表现水平过拟合 泛化能力差&#xff0c;在训练集表现良好&#xff0c;但在其他数据集表现差 通常发生在模型复杂度显著高于实际对象&#xff0c;或对训练集的学习次数过多…