Java 实现 Presigned 操作

生成GET请求地址 (presignedGetObject)

生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。方法声明如下:

public String presignedGetObject(String bucketName, String objectName)
public String presignedGetObject(String bucketName, String objectName, Integer expires)

其中:

  • bucketName:存储桶名称

  • objectName:存储桶里的对象名称

  • expiry:失效时间(以秒为单位),默认是7天,不得大于七天

实例:生成 files 存储桶下面 308608.jpg 图片对象的临时访问 URL 地址,默认该地址有效期为7天。使用该地址可以在浏览器中查看该图片对象,不用输入 accessKey 和 securetKey。代码如下:

package com.hxstrive.minio.demos.presigned;

import io.minio.MinioClient;
import io.minio.errors.MinioException;

/**
 * 获取指定存储桶下对象的临时访问 URL 地址
 * @author Administrator 2021/8/5 22:43
 * @version 1.0
 */
public class PresignedGetObject {
    /** MinioClient.presignedGetObject() example. */
    public static void main(String[] args) throws Exception {
        try {
            MinioClient minioClient = new MinioClient(
                    "http://127.0.0.1:9000",
                    "root", "mypassword");

            // 生成 files 存储桶下面 308608.jpg 图片对象的临时访问地址
            // 默认该地址有效期为7天
            String url = minioClient.presignedGetObject(
                    "files", "308608.jpg");
            System.out.println(url);

            // 生成 files 存储桶下面 308608.jpg 图片对象的临时访问地址
            // 手动指定过期时间为 30 秒
            String url2 = minioClient.presignedGetObject(
                    "files", "308608.jpg", 30);
            System.out.println(url2);
        } catch (MinioException e) {
            e.printStackTrace();
        }
    }
}

生成PUT请求地址 (presignedPutObject)

生成一个给HTTP PUT请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行上传,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。方法声明如下:

public String presignedPutObject(String bucketName, String objectName)
public String presignedPutObject(String bucketName, String objectName, Integer expires)

其中:

  • bucketName:存储桶名称

  • objectName:存储桶里的对象名称

  • expiry:失效时间(以秒为单位),默认是7天,不得大于七天

实例:获取一个 PUT 地址,然后使用 HttpComponent 库发起一个 PUT 请求,将一段文本保存到对象中;再次获取对象的 GET 地址,获取对象内容且输出到控制台。代码如下:

package com.hxstrive.minio.demos.presigned;

import io.minio.MinioClient;
import io.minio.errors.MinioException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.InputStream;

/**
 * 生成一个给 HTTP PUT 请求用的 presigned URL
 * @author Administrator 2021/8/5 22:50
 * @version 1.0
 */
public class PresignedPutObject {
    /** MinioClient.presignedPutObject() example. */
    public static void main(String[] args) throws Exception {
        try {
            MinioClient minioClient = new MinioClient(
                    "http://127.0.0.1:9000",
                    "root", "mypassword");

            // 获取指定存储桶下对象的 PUT URL 地址
            String putUrl = minioClient.presignedPutObject(
                    "files", "myObject.txt");
            System.out.println("put url = " + putUrl);

            // 模拟一个 HTTP PUT 请求
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpPut httpPut = new HttpPut(putUrl);
            httpPut.setEntity(new StringEntity("Hello, World"));
            CloseableHttpResponse responsePut = httpclient.execute(httpPut);
            StatusLine statusLinePut = responsePut.getStatusLine();
            System.out.println("status code = " + statusLinePut.getStatusCode());
            System.out.println("reason phrase = " + statusLinePut.getReasonPhrase());

            // 获取刚刚上传文件内容
            String getUrl = minioClient.presignedGetObject(
                    "files", "myObject.txt");
            System.out.println("get url = " + getUrl);

            HttpGet httpGet = new HttpGet(getUrl);
            CloseableHttpResponse responseGet = httpclient.execute(httpGet);
            StatusLine statusLineGet = responseGet.getStatusLine();
            System.out.println("status code = " + statusLineGet.getStatusCode());
            System.out.println("reason phrase = " + statusLineGet.getReasonPhrase());
            if(statusLineGet.getStatusCode() == HttpStatus.SC_OK) {
                HttpEntity httpEntity = responseGet.getEntity();
                InputStream inputStream = httpEntity.getContent();
                byte[] bytes = new byte[(int)(httpEntity.getContentLength())];
                inputStream.read(bytes);
                inputStream.close();
                System.out.println("content = " + new String(bytes));
            }

        } catch (MinioException e) {
            e.printStackTrace();
        }
    }
}

设置POST请求策略 (presignedPostPolicy)

允许给POST请求的presigned URL设置策略,比如接收对象上传的存储桶名称的策略,key名称前缀,过期策略。方法声明如下:

public Map<String, String> presignedPostPolicy(PostPolicy policy)

其中:

  • policy:对象的post策略

实例:获取存储桶 files 中 myObject.txt 对象的策略信息,代码如下:

package com.hxstrive.minio.demos.presigned;

import io.minio.MinioClient;
import io.minio.PostPolicy;
import io.minio.errors.MinioException;

import java.time.ZonedDateTime;
import java.util.Map;

/**
 * 给POST请求的presigned URL设置策略,比如接收对象上传的存储桶名称的策略,key名称前缀,过期策略
 * @author Administrator 2021/8/6 8:50
 * @version 1.0
 */
public class PresignedPostPolicy {
    /** MinioClient.presignedGetObject() example. */
    public static void main(String[] args) throws Exception {
        try {
            MinioClient minioClient = new MinioClient(
                    "http://127.0.0.1:9000",
                    "root", "mypassword");

            // ZonedDateTime 需要JDK1.8+
            ZonedDateTime expirationDate = ZonedDateTime.now();
            PostPolicy postPolicy = new PostPolicy(
                    "files", "myObject.txt", expirationDate);
            Map<String,String> map = minioClient.presignedPostPolicy(postPolicy);
            for(Map.Entry<String,String> entry : map.entrySet()) {
                System.out.println(entry.getKey() + " = " + entry.getValue());
            }
        } catch (MinioException e) {
            e.printStackTrace();
        }
    }
}

输出如下:

bucket = files
x-amz-date = 20210806T042936Z
x-amz-signature = 04dacf1fcb35e572634519a5383f370366185110350bc9bf5a66c54dcff1c0cd
key = myObject.txt
x-amz-algorithm = AWS4-HMAC-SHA256
x-amz-credential = root/20210806/zh-east-1/s3/aws4_request
policy = eyJleHBpcmF0aW9uIjoiMjAyMS0wOC0wNlQwNDoyOTozNS4zODBaIiwiY29uZGl0aW9ucyI6W1siZXEiLCIkYnVja2V0IiwiZmlsZXMiXSxbImVxIiwiJGtleSIsIm15T2JqZWN0LnR4dCJdLFsiZXEiLCIkeC1hbXotYWxnb3JpdGhtIiwiQVdTNC1ITUFDLVNIQTI1NiJdLFsiZXEiLCIkeC1hbXotY3JlZGVudGlhbCIsInJvb3QvMjAyMTA4MDYvemgtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJdLFsiZXEiLCIkeC1hbXotZGF0ZSIsIjIwMjEwODA2VDA0MjkzNloiXV19
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号