预签名授权下载

最近更新时间: 2024-06-12 15:06:00

适用场景

在默认情况下,存储桶和对象都是私有的。如果您希望第三方可以下载对象,又不希望对方使用 CAM 账户或临时密钥等方式时,您可以使用预签名 URL 的方式将签名提交给第三方,以供完成下载操作。收到有效预签名 URL 的任何人都可以下载对象。

预签名 URL 时,您可以在签名中设置将对象键包含在签名中,只许可下载指定的对象。您也可以在程序中指定预签名 URL 的有效时间,以保证超时后该 URL 不会被未授权方使用。

使用方法

使用 Java SDK

对象存储 COS 的 Java SDK 中提供了此方法,可参考 Java SDK 接口文档生成预签名链接部分。

步骤说明

  1. 初始化客户端 cosclient。

  2. 执行 generatePresignedUrl 方法获取下载签名,下载传入 http 方法为 GET。

代码示例

  1. 以下代码演示了生成预签名的下载链接:

    // 1 初始化用户身份信息(appid, secretId, secretKey)
    COSCredentials cred = new BasicCOSCredentials("AKIDXXXXXXXX", "1A2Z3YYYYYYYYYY");
    // 2 设置bucket的区域, COS地域的简称请参照 /document/product/436/6224
    ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing-1"));
    // 3 生成cos客户端
    COSClient cosclient = new COSClient(cred, clientConfig);
    // 设置bucket名, bucket名需包含appid
    String bucketName = "mybucket-125110000";
    String key = "aaa.txt";
    
    GeneratePresignedUrlRequest req =
            new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
    // 设置签名过期时间(可选), 最大允许设置签名一个月有效, 若未进行设置, 则默认使用ClientConfig中的签名过期时间(5分钟)
    // 这里设置签名在半个小时后过期
    Date expirationDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);
    req.setExpiration(expirationDate);
    
    URL url = cosclient.generatePresignedUrl(req);
    System.out.println(url.toString());
  2. GeneratePresignedUrlRequest 支持设置下载时返回的http头,比如 content-type, content-disposition 等,示例代码如下:

    // 1 初始化用户身份信息(appid, secretId, secretKey)
    COSCredentials cred = new BasicCOSCredentials("AKIDXXXXXXXX", "1A2Z3YYYYYYYYYY");
    // 2 设置bucket的区域, COS地域的简称请参照 /document/product/436/6224
    ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing-1"));
    // 3 生成cos客户端
    COSClient cosclient = new COSClient(cred, clientConfig);
    // 设置bucket名, bucket名需包含appid
    String bucketName = "mybucket-125110000";
    String key = "aaa.txt";
    
    GeneratePresignedUrlRequest req =
            new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
    // 设置下载时返回的http头
    ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
    String responseContentType = "image/x-icon";
    String responseContentLanguage = "zh-CN";
    String responseContentDispositon = "filename=\"abc.txt\"";
    String responseCacheControl = "no-cache";
    String expireStr =
            DateUtils.formatRFC822Date(new Date(System.currentTimeMillis() + 24 * 3600 * 1000));
    responseHeaders.setContentType(responseContentType);
    responseHeaders.setContentLanguage(responseContentLanguage);
    responseHeaders.setContentDisposition(responseContentDispositon);
    responseHeaders.setCacheControl(responseCacheControl);
    responseHeaders.setExpires(expireStr);
    req.setResponseHeaders(responseHeaders);
    URL url = cosclient.generatePresignedUrl(req);
    
    System.out.println(url.toString());
  3. GeneratePresignedUrlRequest 同时支持生成匿名 bucket 的下载链接,匿名 bucket 下载链接无需包含签名,因此无需传入秘钥信息。示例代码如下:

    // 1 对于匿名bucket, 无需传入身份信息
    COSCredentials cred = new AnonymousCOSCredentials();
    // 2 设置bucket的区域, COS地域的简称请参照 /document/product/436/6224
    ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing-1"));
    // 3 生成cos客户端
    COSClient cosclient = new COSClient(cred, clientConfig);
    // 设置bucket名, bucket名需包含appid
    String bucketName = "mybucket-125110000";
    String key = "aaa.txt";
    
    GeneratePresignedUrlRequest req =
            new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
    URL url = cosclient.generatePresignedUrl(req);
    
    System.out.println(url.toString());