AWS S3 学习小结

AWS S3 学习小结1.首先,这个是AWS的开发资源使用文档:AWS开发文档,AWS官网-S3教程​​​​​​​2.我们可以通过AWSCli和JavaApi来操作AWS的S3,AWSCli安装教程:AWSCli安装3.Linux下连接S3前,需要先获取到AWS的IAM的accessKey和secretKey,那么获取方式是:服务->安全、身份与合规分组下的IAM->用户…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1.首先,这个是AWS的开发资源使用文档:AWS开发文档AWS官网 – S3教程

2.我们可以通过AWS Cli和Java Api来操作AWS 的 S3,AWS Cli安装教程:AWS Cli安装

3.Linux下连接S3前,需要先获取到AWS的IAM的accessKey 和secretKey,那么获取方式是:

服务->安全、身份与合规 分组下的 IAM->用户->安全证书->创建访问密钥

AWS S3 学习小结

然后,

AWS S3 学习小结

4.获取到了key之后,以下通过AmazonS3来操作S3:

1) 上传文件到S3

public static String uploadToS3(AmazonS3 s3, File tempFile, String remoteFileName, String bucketName) throws IOException {
        try {
            //上传文件
            s3.putObject(new PutObjectRequest(bucketName, remoteFileName, tempFile).withCannedAcl(CannedAccessControlList.PublicRead));
            //获取一个request
            GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(
                    bucketName, remoteFileName);
            //生成公用的url
            URL url = s3.generatePresignedUrl(urlRequest);
            System.out.println("=========URL=================\n" + url + "\n============URL=============");
            return url.toString();
        } catch (AmazonServiceException ase) {
            ase.printStackTrace();
        } catch (AmazonClientException ace) {
            ace.printStackTrace();
        }
        return null;
    }

2)下载文件到本地(两种方法自己权衡吧)


import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.amazonaws.ClientConfiguration;

/**
 * @description:
 * @create: 2019/4/26 16:24
 **/
public class DownloadFile {

    /**
     * @Title: downFromS3
     * @Description: 将文件下载到本地路径
     * @param @param remoteFileName 文件名
     * @param @param path 下载的路径
     * @param @throws IOException    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void downFromS3(AmazonS3 s3, String remoteFileName, String path, String bucketName) throws IOException {
        try {
            GetObjectRequest request  = new GetObjectRequest(bucketName,remoteFileName);
            s3.getObject(request,new File(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String millToDate(long mills) {
        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date(Long.valueOf(mills+"")));
    }

    public static void main(String[] args)
    {
        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setConnectionTimeout(60*60*1000);
        clientConfig.setSocketTimeout(60*60*1000);

        // (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)
        System.setProperty("aws.accessKeyId","asd");
        System.setProperty("aws.secretKey","tTc");

        String bucket_name = "buk";
        String key_name = "testDir/files.zip";

        System.out.format("Downloading %s from S3 bucket %s... on %s\n", key_name, bucket_name, millToDate(System.currentTimeMillis()));
        final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
//.withClientConfiguration(clientConfig).withPathStyleAccessEnabled(true)
.withRegion(Regions.US_EAST_2).build();
        try {
            S3Object o = s3.getObject(bucket_name, key_name);
            S3ObjectInputStream s3is = o.getObjectContent();
            FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\Desktop\\rawfiles.Zip"));
            byte[] read_buf = new byte[1024];
            int read_len = 0;
            while ((read_len = s3is.read(read_buf)) > 0) {
                fos.write(read_buf, 0, read_len);
            }
            s3is.close();
            fos.close();
        } catch (AmazonServiceException e) {
            System.err.println(e.getErrorMessage());
            System.exit(1);
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        System.out.println("Done!"+ millToDate(System.currentTimeMillis()));
    }
}

3) 测试

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.transfer.TransferManager;
import utils.DownloadFile;
import utils.UploadFile;

import java.io.File;
import java.io.IOException;
import java.util.List;


public class testConnection {

    static AmazonS3         s3;
    static TransferManager tx;
    private static String AWS_ACCESS_KEY = "abc";
    private static String AWS_SECRET_KEY = "efg";
    static final String bucketName = "hij";

    static {
        ClientConfiguration config = new ClientConfiguration();
        config.setConnectionTimeout(10000);
        config.setSocketTimeout(300000);
        s3 = new AmazonS3Client(new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY), config);
        Region usWest2 = Region.getRegion(Regions.US_EAST_1);
        s3.setRegion(usWest2);
    }

    public static void main(String[] args) {
        
        //枚举bucket
        List<Bucket> buckets = s3.listBuckets();
        for (Bucket bucket : buckets) {
            System.out.println("Bucket: " + bucket.getName() + bucket.getOwner());
        }

        // 上传
        try {
            UploadFile.uploadToS3(s3, new File("D:\\workplace\\xml_\\i2.xml"), "testFile", bucketName);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 下载
        try {
            DownloadFile.downFromS3(s3, "test", "C:\\Users\\Desktop\\in.xml", bucketName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 按行读取S3的GZip
    public void test13() {
        System.setProperty("aws.accessKeyId", "abc");
        System.setProperty("aws.secretKey", "asd");
        String bucket_name = "test";
        String key_name = "data_date=20190814/inst.txt.gz";

        System.out.format("Downloading %s from S3 bucket %s...\n", key_name, bucket_name);
        final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).withRegion(Regions.US_EAST_2).build();
        try {
            S3Object o = s3.getObject(bucket_name, key_name);
            S3ObjectInputStream s3is = o.getObjectContent();
            InputStream in = new GZIPInputStream(s3is);
            BufferedReader in2=new BufferedReader(new InputStreamReader(in));
            String y="";
            while((y=in2.readLine())!=null){//一行一行读

                System.out.println(y);

            }
            s3is.close();
        } catch (AmazonServiceException e) {
            System.err.println(e.getErrorMessage());
            System.exit(1);
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

    }
}

5. 以下通过S3Client来操作S3:

1)  小文件流上传到S3

    public void putObject(String bucket, String key, String filePath) throws IOException {
        s3.putObject(PutObjectRequest.builder().bucket(bucket).key(key).build(),
                RequestBody.fromByteBuffer(ByteBuffer.wrap(inputStream2ByteArray(filePath))));
    }

    public void putObject(String bucket, String key, byte[] bytes) {
        s3.putObject(PutObjectRequest.builder().bucket(bucket).key(key).build(),
                RequestBody.fromByteBuffer(ByteBuffer.wrap(bytes)));
    }

    public static byte[] inputStream2ByteArray(String filePath) throws IOException {
        try (InputStream in = new FileInputStream(filePath)) {
            byte[] data = toByteArray(in);
            return data;
        }
    }

2) 分部上传文件流到S3

    /**
     * Get upload id from s3
     */
    public static String getUploadId(String bucketName, String key, Region region){
        s3 = S3Client.builder().region(region).build();
        // First create a multipart upload and get upload id
        CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder()
                .bucket(bucketName).key(key)
                .build();
        CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest);
        String uploadId = response.uploadId();
        return uploadId;
    }
    /**
     * Multipart upload
     */
    public static void multipartUpload(String bucketName, String key,
                                       List<String> etags, List<CompletedPart> completedParts,
                                       String uploadId, byte[] cbuf, int off) {
        Region region = Region.US_EAST_2;
        s3 = S3Client.builder().region(region).build();
        //record upload end tag
        ByteBuffer bf = ByteBuffer.wrap(cbuf);
        UploadPartRequest uploadPartRequest = UploadPartRequest.builder().bucket(bucketName).key(key)
                .uploadId(uploadId)
                .partNumber(off).build();
        String etag = s3.uploadPart(uploadPartRequest, RequestBody.fromByteBuffer(bf)).eTag();
        CompletedPart part = CompletedPart.builder().partNumber(off).eTag(etag).build();
        etags.add(etag);
        completedParts.add(part);
    }

    /**
     * Complete multipart upload
     */
    public static void completeMultipartUpload(String bucketName, String key, List<CompletedPart> completedParts, String uploadId) {
        // Finally call completeMultipartUpload operation to tell S3 to merge all uploaded
        // parts and finish the multipart operation.
        CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder().parts(completedParts).build();
        CompleteMultipartUploadRequest completeMultipartUploadRequest =
                CompleteMultipartUploadRequest.builder().bucket(bucketName).key(key).uploadId(uploadId)
                        .multipartUpload(completedMultipartUpload).build();
        s3.completeMultipartUpload(completeMultipartUploadRequest);
    }

其中的先后顺序是:getUploadId -> multipartUpload … -> completeMultipartUpload

 

1. 遇到:AWS error downloading object from S3, “profile file cannot be null”,参考:https://stackoverflow.com/questions/41796355/aws-error-downloading-object-from-s3-profile-file-cannot-be-null

2. 遇到:SocketTimeoutException: Read timed out,参考:http://www.unixresources.net/faq/28195217.shtml

3. 遇到:S3的Status Code: 404 指的是 bucket 名字写错了

4. 遇到:S3的Status Code: 301,那么检查一下Region对不对。

AWS S3 学习小结

5. 遇到:Unable to unmarshall response (null). Response Code: 200, Response Text: OK… ,问题在于调用s3.getObject()的时候,本地已存在相同名字的文件了。

6. 遇到:Your socket connection to the server was not read from or written to within the timeout period… ,解决这个问题可能需要设置S3 configuration的retry policy,参考:Recurrent “Idle connection..” exception in S3Client.putObject

AWS S3 学习小结

官网的解释是:How can I troubleshoot the error

 

参考

1.AWS S3使用demo

2.S3 java SDK连接

3.命令行管理aws s3

1. https://blog.csdn.net/harryhare/article/details/80710279

2. API 示例查看文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180099.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月19日 下午10:16
下一篇 2022年10月19日 下午10:16


相关推荐

  • MapStruct 详解

    MapStruct 详解GitHub 访问地址 nbsp https github com mapstruct mapstruct 使用例子 nbsp https github com mapstruct mapstruct examples nbsp MapStrcut 与其它工具对比以及使用说明 http www tuicool com articles uiIRjai nbsp BeanUtils copyPro

    2026年3月17日
    2
  • 扣子Coze工作流实战 | 输入关键词,Coze 自动采集小红书热门笔记,运营太省事了

    扣子Coze工作流实战 | 输入关键词,Coze 自动采集小红书热门笔记,运营太省事了

    2026年3月12日
    2
  • php 监听端口数据客户端ip_PHP获取客户端和服务器端IP[通俗易懂]

    客户端的ip变量:$_SERVER[‘REMOTE_ADDR’]:客户端IP,也有可能是代理IP$_SERVER[‘HTTP_CLIENT_IP’]:代理端的IP,可能存在,也可能伪造$_SERVER[‘HTTP_X_FORWARD_FOR’]:用户在哪个ip上使用的id,可能存在,也可能伪造服务端的ip变量:$_SERVER[‘SERVER_NAME’]:需要使用函数gethostname…

    2022年4月17日
    55
  • javascript 基础_JavaScript高级编程

    javascript 基础_JavaScript高级编程JavaScript知识总结(高级篇)1.深入基础1.1数据类型1.分类:-基本类型-String:任意字符串-Number:任意的数字-boolean:true/false-undefined:未定义-null:空-引用(对象)类型-Object:任意对象-Function:一种特别的对象(可以执行)-Array:一种特别的对象(数值下标,内部数据是有序的)2.判断:-typeof:可以判断:undefined、数值、字符串、布尔值不能判断:null与object

    2022年8月20日
    9
  • jdk卸载错误

    jdk卸载错误错误提示:已经安装了这个版本提示是否卸载;   在开始运行中输入regedit打开注册表,定位到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall错误提示:无法使用此产品的安装源。请确认安装源存在,并且您可以访问它。   优化大师和360也无法卸载,删注册表HKEY_LOCAL_MAC

    2022年6月15日
    49
  • copy和deepcopy[通俗易懂]

    copy和deepcopy[通俗易懂]总结一下,如果一个集合中的元素是字符串,copy之后则是两个互不相干的新集合,内存地址也不一样,修改任意一个另一个不会做出改变,但是如果其中的元素有数组的话,那么情况就不一样了,copy后虽然集合是两个完全新的集合,但是集合中的数组指向的是同一个内存地址,在此集合中对其中的数组数据进行修改,另一个集合中的元素是数组的内容也会改变,如果想完完全全独立出来是两个独立的集合,就得使用deepcopy而不…

    2022年10月2日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号