AmazonS3 for java
Posted 李肖峰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AmazonS3 for java相关的知识,希望对你有一定的参考价值。
官方文档:https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/welcome.html
感谢大神分享https://blog.csdn.net/u012147490/article/details/53097459
Amazon S3是一种云上的存储服务器,其功能仅在于存储。和普通的服务器不同,它没有操作界面,连一般的SSH命令登录功能都没有。和它打交道的话,一种办法是用它的管理界面,另一种是借助其编程接口。
Amazon S3 特意内置了着重于简易性和稳健性的最小功能集。以下是 Amazon S3 服务的一些优势:
创建存储桶 – 创建和命名存储数据的存储桶。存储桶是 Amazon S3 中用于数据存储的基础容器。
在存储桶中存储数据 – 在存储桶中存储无限量的数据。可将所需数量的对象上传到 Amazon S3 存储桶。每个数据元可包含最多 5 TB 的数据。使用开发人员分配的唯一密钥存储和检索每个对象。
下载数据 – 下载您的数据或允许其他人进行下载。随时下载您的数据或允许其他人执行相同的操作。
权限 - 对于要在您的 Amazon S3 存储桶中上传或下载数据的其他人员,您可以授予其访问权限或拒绝其访问。将上传和下载的许可授予三种类型的用户。身份验证机制可帮助确保数据安全,以防未授权访问。
标准接口 – 使用基于标准的 REST 和 SOAP 接口,它们可与任何 Internet 开发工具包搭配使用。
Note
HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。
使用 MSI 安装程序安装 AWS CLI (Windows)
名词和术语
AWS Account:Amazon Web Service Account, 一般一个公司会申请一个帐户,可以认为管理员帐户。
IAM User:一般AWS只有少数人掌握,为了操作的方式,添加子帐户称为IAM帐户,每个帐户有不同的权限。无论是AWS还是IAM帐户,都有一个Access Key ID和一个Secret Key。在Amazon Web 管理界面上登录时使用帐户名,而用编程接口交互时都用的是Access Key ID和Secret Key,其中ID是16个字符,Secret是40个字节。
存储桶
存储桶是 Amazon S3 中用于存储数据元的容器。每个数据元都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的数据元存储在 johnsmith 存储桶中,则可使用 URL http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 对该数据元进行寻址
存储桶有以下几种用途:组织最高等级的 Amazon S3 命名空间、识别负责存储和数据传输费用的账户、在访问控制中发挥作用以及用作使用率报告的汇总单位。
Access Control:S3上的Object默认是不能public访问的,这意味着,你上传一个Object的Key=photos/puppy.jpg,并不能直接通过http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 直接访问,会提示Access Denied,只要在设置权限(ACL或Policy之后才可以访问)。
对象
数据元是 Amazon S3 中存储的基本实体。数据元由数据元数据和元数据组成。数据部分对 Amazon S3 不透明。元数据是一组描述数据元的名称-值对。其中包括一些默认元数据(如上次修改日期)和标准 HTTP 元数据(如 Content-Type)。您还可以在存储对象时指定自定义元数据。
在存储桶中,数据元将由密钥(名称)和版本 ID 进行唯一地标识。有关详细信息,请参阅密钥和版本控制。
键
密钥是指存储桶中数据元的唯一标识符。存储桶内的每个数据元都只能有一个密钥。由于将存储桶、密钥和版本 ID 组合在一起可唯一地标识每个数据元,可将 Amazon S3 视为一种“存储桶 + 密钥 + 版本”与数据元本身间的基本数据映射。将 Web 服务终端节点、存储桶名、密钥和版本(可选)组合在一起,可唯一地寻址 Amazon S3 中的每个数据元。例如,在 URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl 中,“doc”是存储桶的名称,而“2006-03-01/AmazonS3.wsdl”是密钥。
常用操作
解压后所有文件夹下的jar包
介绍到这里,直接贴代码
//申明变量 /** * keyID */ public static String accessKeyID = "accessKeyID"; /** * key */ public static String secretKey = "secretKey"; /** * 以理解为一个很大的磁储硬盘,其容量以T为单位 */ public static String bucketName = "bucketName"; /** * 上传文件地址 */ public static String localPath = "E:XXX/XXX.JPG"; /** * 存储新对象的键 */ public static String s3Path = "amazonS3"; //创建Amazon S3对象 AWSCredentials credentials; AmazonS3 s3Client; credentials = new BasicAWSCredentials(accessKeyID, secretKey); s3Client = new AmazonS3Client(credentials); //设置区域 Region cnnorth1 = Region.getRegion(Regions.CN_NORTH_1); s3Client.setRegion(cnnorth1); /** * 查看所有可用的bucket * @param s3Client */ public static void getAllBucket(AmazonS3 s3Client){ List<Bucket> buckets = s3Client.listBuckets(); for (Bucket bucket : buckets) { System.out.println("Bucket: " + bucket.getName()); } } /** * 查看bucket下所有的object * @param bucketName 存储桶 */ public static void getAllBucketObject(AmazonS3 s3Client){ ObjectListing objects = s3Client.listObjects(bucketName); do { for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { System.out.println("Object: " + objectSummary.getKey()); } objects = s3Client.listNextBatchOfObjects(objects); } while (objects.isTruncated()); } /** * amazonS3文件上传 * @param s3Client * @param bucketName 保存到某个存储桶 * @param key 保存文件的key (以key-value形式保存) * @param file 上传文件 */ public static void amazonS3Upload(AmazonS3 s3Client,String bucketName,String key,File file){ PutObjectResult result=s3Client.putObject(new PutObjectRequest(bucketName, key, file)); System.out.println("PutObjectResult: "+result.toString()); } /** * amazonS3文件下载 * @param s3Client * @param bucketName 下载某个存储桶的数据 * @param key 下载文件的key * @param targetFilePath 下载文件保存地址 */ public static void amazonS3Downloading(AmazonS3 s3Client,String bucketName,String key,String targetFilePath){ S3Object object = s3Client.getObject(new GetObjectRequest(bucketName,key)); if(object!=null){ System.out.println("Content-Type: " + object.getObjectMetadata().getContentType()); InputStream input = null; FileOutputStream fileOutputStream = null; byte[] data = null; try { //获取文件流 input=object.getObjectContent(); data = new byte[input.available()]; int len = 0; fileOutputStream = new FileOutputStream(targetFilePath); while ((len = input.read(data)) != -1) { fileOutputStream.write(data, 0, len); } } catch (IOException e) { e.printStackTrace(); }finally{ if(fileOutputStream!=null){ try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(input!=null){ try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 文件删除 * @param s3Client * @param bucketName 删除文件所在存储桶 * @param key 删除文件key */ public static void amazonS3DeleteObject(AmazonS3 s3Client,String bucketName,String key){ s3Client.deleteObject(bucketName, key); } /** * 删除存储桶 * @param s3Client * @param bucketName 需要删除的存储桶 */ public static void amazonS3DeleteBucket(AmazonS3 s3Client,String bucketName){ s3Client.deleteBucket(bucketName); } //在文件比较大的时候,有必要用多线程上传。(未测试) TransferManager tm = new TransferManager(s3Client); TransferManagerConfiguration conf = tm.getConfiguration(); int threshold = 4 * 1024 * 1024; conf.setMultipartUploadThreshold(threshold); tm.setConfiguration(conf); Upload upload = tm.upload(bucketName, s3Path, new File(localPath)); TransferProgress p = upload.getProgress(); while (upload.isDone() == false) { int percent = (int)(p.getPercentTransfered()); Thread.sleep(500); } // 默认添加public权限 s3Client.setObjectAcl(bucketName, s3Path, CannedAccessControlList.PublicRead);
- 155
- 156
- 157
我也是刚刚使用,不详细的地方,请大家在API中查看
以上是关于AmazonS3 for java的主要内容,如果未能解决你的问题,请参考以下文章
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段
导入com.amazonaws.services.s3.AmazonS3ClientBuilder无法解析