zoukankan      html  css  js  c++  java
  • AWS S3 对象存储服务

    虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已

    1.图片上传

    1.1

    S3 Java SDK 分两个版本,1.0和2.0 , 1.0 的S3对象是AmazonS3 ,2.0的忘记了,下面的示例代码,是1.0版本的

    1.2导包

    <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-bom</artifactId>
                    <version>1.11.558</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk-s3</artifactId>
            </dependency>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk-s3control</artifactId>
            </dependency>
        </dependencies>
    

    1.3代码,已经可以运行了,但是还需要配置Id和秘钥

    public static void main(String[] args) throws Exception {
            String clientRegion = "ap-east-1";
            String bucketName = "hotupdates";
            String keyName = "abc/demo.txt";
            String filePath = "C:\Users\Owner\Desktop\demo.txt";
    
            try {
                AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                        .withRegion(clientRegion)
                        .withCredentials(new ProfileCredentialsProvider())
                        .build();
                TransferManager tm = TransferManagerBuilder.standard()
                        .withS3Client(s3Client)
                        .build();
                Upload upload = tm.upload(bucketName, keyName, new File(filePath));
                System.out.println("Object upload started");
                upload.waitForCompletion();
                tm.shutdownNow();
                System.out.println("Object upload complete");
            }
            catch(AmazonServiceException e) {
                e.printStackTrace();
            }
            catch(SdkClientException e) {
                e.printStackTrace();
            }
        }
    

    1.4 配置ID和秘钥

    Windows 在C:Usersxxx.aws这个文件下面创建两个文件,没有后缀的哟
    文件1:config

    [default]
    region = ap-east-1
    

    文件2:credentials

    [default]
    aws_access_key_id=xxxxxxxxxxxxxxxxxxx
    aws_secret_access_key=xxxxxxxxxxxxxxxxxxx
    

    1.5 到这就可以运行了

    1.6 想要在上传的时候打印进度条

    public class HighLevelMultipartUpload2 {
    
        public static void main(String[] args) throws Exception {
            String clientRegion = "ap-east-1";
            String bucketName = "hotupdates";
            String keyName = "abc/demo.txt";
            String filePath = "C:\Users\Owner\Desktop\demo.txt";
    
            try {
                AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                        .withRegion(clientRegion)
                        .withCredentials(new ProfileCredentialsProvider())
                        .build();
                TransferManager tm = TransferManagerBuilder.standard()
                        .withS3Client(s3Client)
                        .build();
    
                // TransferManager processes all transfers asynchronously,
                // so this call returns immediately.
                Upload upload = tm.upload(bucketName, keyName, new File(filePath));
                System.out.println("Object upload started");
    
                // Optionally, wait for the upload to finish before continuing.
                upload.waitForCompletion();
    
    
                tm.shutdownNow();
    //            XferMgrProgress.showTransferProgress(upload);
    //            XferMgrProgress.waitForCompletion(upload);
    
    
                System.out.println("Object upload complete");
            }
            catch(AmazonServiceException e) {
                e.printStackTrace();
            }
            catch(SdkClientException e) {
                e.printStackTrace();
            }
        }
    }
    
    public class XferMgrProgress
    {
        // waits for the transfer to complete, catching any exceptions that occur.
        public static void waitForCompletion(Transfer xfer)
        {
            try {
                xfer.waitForCompletion();
            } catch (AmazonServiceException e) {
                System.err.println("Amazon service error: " + e.getMessage());
                System.exit(1);
            } catch (AmazonClientException e) {
                System.err.println("Amazon client error: " + e.getMessage());
                System.exit(1);
            } catch (InterruptedException e) {
                System.err.println("Transfer interrupted: " + e.getMessage());
                System.exit(1);
            }
        }
    
        // Prints progress while waiting for the transfer to finish.
        public static void showTransferProgress(Transfer xfer)
        {
            // print the transfer's human-readable description
            System.out.println(xfer.getDescription());
            // print an empty progress bar...
            printProgressBar(0.0);
            // update the progress bar while the xfer is ongoing.
            do {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    return;
                }
                // Note: so_far and total aren't used, they're just for
                // documentation purposes.
                TransferProgress progress = xfer.getProgress();
                long so_far = progress.getBytesTransferred();
                long total = progress.getTotalBytesToTransfer();
                double pct = progress.getPercentTransferred();
                eraseProgressBar();
                printProgressBar(pct);
            } while (xfer.isDone() == false);
            // print the final state of the transfer.
            Transfer.TransferState xfer_state = xfer.getState();
            System.out.println(": " + xfer_state);
        }
    
        // Prints progress of a multiple file upload while waiting for it to finish.
        public static void showMultiUploadProgress(MultipleFileUpload multi_upload)
        {
            // print the upload's human-readable description
            System.out.println(multi_upload.getDescription());
    
            Collection<? extends Upload> sub_xfers = new ArrayList<Upload>();
            sub_xfers = multi_upload.getSubTransfers();
    
            do {
                System.out.println("
    Subtransfer progress:
    ");
                for (Upload u : sub_xfers) {
                    System.out.println("  " + u.getDescription());
                    if (u.isDone()) {
                        Transfer.TransferState xfer_state = u.getState();
                        System.out.println("  " + xfer_state);
                    } else {
                        TransferProgress progress = u.getProgress();
                        double pct = progress.getPercentTransferred();
                        printProgressBar(pct);
                        System.out.println();
                    }
                }
    
                // wait a bit before the next update.
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    return;
                }
            } while (multi_upload.isDone() == false);
            // print the final state of the transfer.
            Transfer.TransferState xfer_state = multi_upload.getState();
            System.out.println("
    MultipleFileUpload " + xfer_state);
        }
    
        // prints a simple text progressbar: [#####     ]
        public static void printProgressBar(double pct)
        {
            // if bar_size changes, then change erase_bar (in eraseProgressBar) to
            // match.
            final int bar_size = 40;
            final String empty_bar = "                                        ";
            final String filled_bar = "########################################";
            int amt_full = (int)(bar_size * (pct / 100.0));
            System.out.format("  [%s%s]", filled_bar.substring(0, amt_full),
                    empty_bar.substring(0, bar_size - amt_full));
        }
    
        // erases the progress bar.
        public static void eraseProgressBar()
        {
            // erase_bar is bar_size (from printProgressBar) + 4 chars.
            final String erase_bar = "";
            System.out.format(erase_bar);
        }
    
        public static void uploadFileWithListener(String file_path,
                                                  String bucket_name, String key_prefix, boolean pause)
        {
            System.out.println("file: " + file_path +
                    (pause ? " (pause)" : ""));
    
            String key_name = null;
            if (key_prefix != null) {
                key_name = key_prefix + '/' + file_path;
            } else {
                key_name = file_path;
            }
    
            File f = new File(file_path);
            TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
            try {
                Upload u = xfer_mgr.upload(bucket_name, key_name, f);
                // print an empty progress bar...
                printProgressBar(0.0);
                u.addProgressListener(new ProgressListener() {
                    public void progressChanged(ProgressEvent e) {
                        double pct = e.getBytesTransferred() * 100.0 / e.getBytes();
                        eraseProgressBar();
                        printProgressBar(pct);
                    }
                });
                // block with Transfer.waitForCompletion()
                XferMgrProgress.waitForCompletion(u);
                // print the final state of the transfer.
                Transfer.TransferState xfer_state = u.getState();
                System.out.println(": " + xfer_state);
            } catch (AmazonServiceException e) {
                System.err.println(e.getErrorMessage());
                System.exit(1);
            }
            xfer_mgr.shutdownNow();
        }
    
        public static void uploadDirWithSubprogress(String dir_path,
                                                    String bucket_name, String key_prefix, boolean recursive,
                                                    boolean pause)
        {
            System.out.println("directory: " + dir_path + (recursive ?
                    " (recursive)" : "") + (pause ? " (pause)" : ""));
    
            TransferManager xfer_mgr = new TransferManager();
            try {
                MultipleFileUpload multi_upload = xfer_mgr.uploadDirectory(
                        bucket_name, key_prefix, new File(dir_path), recursive);
                // loop with Transfer.isDone()
                XferMgrProgress.showMultiUploadProgress(multi_upload);
                // or block with Transfer.waitForCompletion()
                XferMgrProgress.waitForCompletion(multi_upload);
            } catch (AmazonServiceException e) {
                System.err.println(e.getErrorMessage());
                System.exit(1);
            }
            xfer_mgr.shutdownNow();
        }
    
        public static void main(String[] args)
        {
            final String USAGE = "
    " +
                    "Usage:
    " +
                    "    XferMgrProgress [--recursive] [--pause] <s3_path> <local_path>
    
    " +
                    "Where:
    " +
                    "    --recursive - Only applied if local_path is a directory.
    " +
                    "                  Copies the contents of the directory recursively.
    
    " +
                    "    --pause     - Attempt to pause+resume the upload. This may not work for
    " +
                    "                  small files.
    
    " +
                    "    s3_path     - The S3 destination (bucket/path) to upload the file(s) to.
    
    " +
                    "    local_path  - The path to a local file or directory path to upload to S3.
    
    " +
                    "Examples:
    " +
                    "    XferMgrProgress public_photos/cat_happy.png my_photos/funny_cat.png
    " +
                    "    XferMgrProgress public_photos my_photos/cat_sad.png
    " +
                    "    XferMgrProgress public_photos my_photos
    
    ";
    
            if (args.length < 2) {
                System.out.println(USAGE);
                System.exit(1);
            }
    
            int cur_arg = 0;
            boolean recursive = false;
            boolean pause = false;
    
            // first, parse any switches
            while (args[cur_arg].startsWith("--")) {
                if (args[cur_arg].equals("--recursive")) {
                    recursive = true;
                } else if (args[cur_arg].equals("--pause")) {
                    pause = true;
                } else {
                    System.out.println("Unknown argument: " + args[cur_arg]);
                    System.out.println(USAGE);
                    System.exit(1);
                }
                cur_arg += 1;
            }
    
            // only the first '/' character is of interest to get the bucket name.
            // Subsequent ones are part of the key name.
            String s3_path[] = args[cur_arg].split("/", 2);
            cur_arg += 1;
    
            String bucket_name = s3_path[0];
            String key_prefix = null;
            if (s3_path.length > 1) {
                key_prefix = s3_path[1];
            }
    
            String local_path = args[cur_arg];
    
            // check to see if local path is a directory or file...
            File f = new File(args[cur_arg]);
            if (f.exists() == false) {
                System.out.println("Input path doesn't exist: " + args[cur_arg]);
                System.exit(1);
            }
            else if (f.isDirectory()) {
                uploadDirWithSubprogress(local_path, bucket_name, key_prefix,
                        recursive, pause);
            } else {
                uploadFileWithListener(local_path, bucket_name, key_prefix, pause);
            }
        }
    }
    

    参考官网:https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/credentials.html

    2.其余的一些配置

    2.1跨域

    <CORSConfiguration>
     <CORSRule>
       <AllowedOrigin>*</AllowedOrigin>
       <AllowedMethod>PUT</AllowedMethod>
       <AllowedMethod>POST</AllowedMethod>
       <AllowedMethod>DELETE</AllowedMethod>
       <AllowedMethod>GET</AllowedMethod>
       <AllowedMethod>HEAD</AllowedMethod>
       <AllowedHeader>*</AllowedHeader>
      <MaxAgeSeconds>3000</MaxAgeSeconds>
     </CORSRule>
    </CORSConfiguration>
    

    2.2 存储桶策略

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1546506260886",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "*"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::apk-online/*"
            }
        ]
    }
    

    apk-online 是桶名

    yanganlin.com
  • 相关阅读:
    转载:javaweb学习总结(八)——HttpServletResponse对象(二)
    转载:javaweb学习总结(七)——HttpServletResponse对象(一)
    转载:javaweb学习总结(六)——Servlet开发(二)
    转载:javaweb学习总结(五)——Servlet开发(一)
    转载:javaweb学习总结(四)——Http协议
    蓝桥杯 答题分数
    Saruman's Army (POJ 3069)
    Best Cow Line (POJ 3217)
    区间调度问题
    硬币问题
  • 原文地址:https://www.cnblogs.com/yal950727/p/10956964.html
Copyright © 2011-2022 走看看