出处:http://blog.csdn.net/iamshaofa/article/details/7877785
Amazon S3是一种云上的存储服务器,其功能仅在于存储。和普通的服务器不同,它没有操作界面,连一般的SSH命令登录功能都没有。和它打交道的话,一种办法是用它的管理界面,另一种是借助其编程接口。
1.名词和术语
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个字节。
Bucket: 可以理解为一个很大的磁储硬盘,其容量以T为单位,当然,你肯花的钱越多就可以买到更大容易的S3。一个AWS帐户可以创建N个(N<100)个bucket。bucket的名称作为domain name的一部分,例如,如果bucket名称叫mybucket,则其全称为http://mybucket.s3.amazonaws.com/
Object:Bucket的文件,不过在这里称为资源更好些。在Bucket所有的Object呈Flat状排列,每个Object有一个唯一的Key,可以理解为URI。需要注意的是,Bucket里没有目录树的概念,虽然一个Object Key可能显示为 a/b/c/my.jpg,并不意味着有a, b, c三个目录和一个my.jpg的文件。事实上,只有一个资源,其名称Key就是一个全路径而已。
Object Key: 表示其名称,在bucket内全局唯一,实际就是一个可带斜线/的字符串,如/a/b/c/my.jpg
Object Meta: 描述其大小,ACL等
Object Value: 就是Object的内容,其长度为Meta里长度
Object Version: 默认不带版本支持的,只要显示的设置bucket之后才有Version概念
Access Control:S3上的Object默认是不能public访问的,这意味着,你上传一个Object的Key=a/my.html,并不能直接通过http://mybucket.s3.amazonaws.com/a/my.html直接访问,会提示Access Denied,只要在设置权限(ACL或Policy之后才可以访问)
2.常用操作
S3服务器提供了SOAP/HTTP接口,官方称为REST API。同时为了使用了方便在其上封装了一层SDK,支持Java, PHP, .Net, Ruby接口,可惜的暂时没有C++接口。一般程序员们可以用它的SDK,还是很方便的,满足大部分操作的需求。
先声明一些变量
- String accessKeyID = "xxxxxxxxxxxxxx";
- String secretKey = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
- String bucketName = "zzzzzzzzzz";
- AWSCredentials credentials;
- AmazonS3 s3Client;
- credentials = new BasicAWSCredentials(accessKeyID, secretKey);
- s3Client = new AmazonS3Client(credentials);
(1) 查看可用的bucket
只要给定了AWS Account / IAM User的ID和Secret,就可以直接遍例出所有该用户可以访问的bucket。当然,bucket一般是建议由管理员在页面上设置的,一般在程序里不需要对bucket进行操作。
- List<Bucket> buckets = s3Client.listBuckets();
- for (Bucket bucket : buckets)
- {
- System.out.println("Bucket: " + bucket.getName());
- }
(2) 查看bucket下所有的object
- ObjectListing objects = s3Client.listObjects(myBucketName);
- do
- {
- for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
- {
- System.out.println("Object: " + objectSummary.getKey());
- }
- objects = s3Client.listNextBatchOfObjects(objects);
- } while (objects.isTruncated());
实际上,可以按前缀进行list操作,不然要list的东西太多了。
- ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
- .withBucketName(bucketName)
- .withPrefix(prefix)
- ;
- ObjectListing objects = s3Client.listObjects(listObjectsRequest);
- ...
【补充 1012-08-21】
按目录层次查询:虽然S3服务器上并无目录的概念,但是在List接口上添加了按层次查询的支持,具体就是Prefix和Delimiter的结合,一般Delimiter就是斜线/。具体解释一下,就是如果存在:
china/beijing/a.txt
china/beijing/b.txt
china/anhui/c.txt
china/all.txt
想列出china/下的第一级层次,可以设置prefix="china/", delimiter="/",通过ObjectListing的getCommonprefixes()得到china/beijing/, china/anhui/共两项(子目录),通过getObjectSummaries()得到china/all.txt (叶子节点)。
- ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
- .withBucketName(bucketName)
- .withPrefix(prefix)
- .withDelimiter("/")
- ;
- ObjectListing objects = s3Client.listObjects(listObjectsRequest);
- do
- {
- for(String objKey : objects.getCommonPrefixes())
- {
- System.out.println("+ " + objKey);
- }
- for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
- {
- String objKey = objectSummary.getKey();
- //keyList.add(objKey);
- System.out.println(objKey);
- }
- objects = s3Client.listNextBatchOfObjects(objects);
- } while (objects.isTruncated());
(3) 上传文件
需要强调的是,本地文件系统有目录的概念,但是在S3上没有目录的概念,其URI只是作为Object的key出现。这里顺便在添加的时候赋予该Object一个Public Read权限,以便可以匿名访问。
- File file = new File(localPath);
- // 默认添加public权限
- s3Client.putObject(new PutObjectRequest(bucketName, s3Path, file)
- .withCannedAcl(CannedAccessControlList.PublicRead));
(4) 多线程上传
在文件比较大的时候,有必要用多线程上传。
- 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());
- System.out.print("\r" + localPath + " - " + "[ " + percent + "% ] "
- + p.getBytesTransfered() + " / " + p.getTotalBytesToTransfer() );
- // Do work while we wait for our upload to complete...
- Thread.sleep(500);
- }
- System.out.print("\r" + localPath + " - " + "[ 100% ] "
- + p.getBytesTransfered() + " / " + p.getTotalBytesToTransfer() );
- // 默认添加public权限
- s3Client.setObjectAcl(bucketName, s3Path, CannedAccessControlList.PublicRead);
(5) 删除Object
- DeleteObjectRequest request = new DeleteObjectRequest(bucketName, s3Path);
- s3Client.deleteObject(request);
(6) 重命名Object
没有直接的命名接口,而是借用copy接口来实现。
重命名分为2步:(1) 调用copy接口,作一个拷贝
(2) 调用delete接口,删除原来的Object
- System.out.println(s3PathOld + " -> " + s3PathNew);
- S3Object obj = s3Client.getObject(new GetObjectRequest(bucketName, s3PathOld));
- s3Client.copyObject(bucketName, s3PathOld,
- bucketName, s3PathNew);
- deleteFile(s3PathOld);
3.Access Control权限设置
上面有个简单的ACL设置,一般也够用了。如果此篇受大家欢迎的话,我再补上更详细的说明。
相关推荐
Amazon S3,全称为Amazon Simple Storage Service,是亚马逊公司提供的一种云存储服务,旨在为互联网用户提供高可用性、高持久性和低成本的数据存储解决方案。通过使用S3,开发者和企业能够安全地存储和检索任何数量...
【标题】"esdk_obs_native_go" 是一个针对华为云存储S3服务的Go语言SDK,它提供了与云存储设备紧密集成的接口。这个SDK旨在让开发者能够方便地在Go应用中实现对华为云对象存储服务(OBS)的操作。 【描述】"esdk_...
MINIO服务器是一款开源的对象存储系统,它模仿了亚马逊的S3云存储服务。在这个场景中,我们将探讨如何使用AWS S3 SDK(Software Development Kit)在C++中实现对MINIO服务器上的文件进行上传和下载。AWS S3 SDK为...
Amazon S3 EC2 API 是亚马逊网络服务(AWS)提供的一组接口,用于与Amazon Simple Storage Service (S3) 和 Elastic Compute Cloud (EC2) 进行交互。S3 是一个高度可扩展的云存储服务,而 EC2 则是 AWS 的计算服务,...
Amazon S3,全称为Simple Storage Service,是亚马逊云服务提供的一种可靠、可扩展且高度安全的云存储解决方案。为了方便开发者使用C语言进行S3相关的操作,亚马逊推出了libs3库。这个库提供了完整的API,使得开发者...
- **技术选型**: 通常选择开源的Java库来简化开发流程,例如JetS3t库,它为开发者提供了丰富的API接口,方便地与Amazon S3等云存储服务交互。 #### 二、Amazon S3服务详解 ##### 2.1 Amazon S3简介 - **服务提供者...
【Python-通过SQS自动化无服务器日志记录到S3】是关于利用Python编程语言,结合Amazon Simple Queue Service (SQS) 和 Amazon Simple Storage Service (S3) 的一种实践,以实现日志处理的自动化。在云环境中,尤其是...
此外,它还支持从浏览器端直接上传数据到那些云存储服务器,以减轻应用服务器端(例如您的网站)的负担。 然而,您仍然能够跟踪那些上传的文件以供以后使用(例如,用户 A 可能希望稍后检索文件 B)。概述如前所述...
这种服务通常由大型云服务提供商如Amazon S3、Google Cloud Storage或阿里云OSS等提供。云存储的优势包括高可用性、可扩展性、成本效益和易于备份与恢复。 Java SDK是针对Java编程语言的开发工具包,它允许开发者...
MinIO是一款专为云环境设计的高性能、开源的对象存储服务器,它主要被用来存储和检索大规模数据集,如图片、视频、文档等非结构化数据。MinIO的设计灵感源自于Amazon S3,但其目标是提供更高性能、更强的安全性和更...
4. **使用API**:s3am库提供了API接口,如`upload_file()`用于上传文件,`download_file()`用于下载文件,`list_buckets()`列出所有S3存储桶等。 5. **命令行工具**:除了API,s3am还提供了一个命令行工具,可以...
AWS S3(Simple Storage Service)是亚马逊提供的一种云存储服务,用于存储和检索大量数据。在本项目"AWS-S3-Sample"中,我们将探讨如何使用C#.Net编程语言与S3进行交互,包括上传文件、下载文件以及列举存储桶...
在现代互联网开发中,云存储服务已经成为不可或缺的一部分,其中Amazon的AWS S3(Simple Storage Service)尤为突出。本篇文章将详细解析如何在Coldfusion环境中利用AWS S3服务,特别是在Lucee服务器上的实践应用。 ...
该库提供了一个简单的接口,用于在Python程序中与Amazon S3存储服务进行交互。资源名称`simple_s3fs-0.1.5-py2.py3-none-any.whl`表明这是一个适用于Python 2和3的二进制分发包,版本号为0.1.5,且不依赖特定的硬件...
在AWS(Amazon Web Services)的云存储服务中,S3(Simple Storage Service)是一个非常重要的组件,用于存储和检索任何规模的数据。本篇将详细解释标题"AWSS3_Access_Source S3操作代码"和描述中提及的知识点,以及...
在本题目中,我们主要涉及三个亚马逊云科技(Amazon Web Services, AWS)的服务:Lambda、API Gateway 和 S3。这些都是云开发中常见的服务,用于构建无服务器架构和数据存储。 **1. 亚马逊云科技服务之 Lambda** ...
AWS S3 JS SDK是Amazon Web Services (AWS)提供的JavaScript库,专为在Web应用程序中与Amazon Simple Storage Service (S3)交互而设计。S3是一个云存储服务,用于存放和检索任意数量的数据,无论何时何地,都能以高...
Amazon S3是亚马逊提供的云存储服务,允许用户在线存储和检索大量数据。它提供了高可用性、高持久性和安全的数据存储解决方案。`archive_to_s3` 库简化了与S3的交互,使得开发者能够方便地上传档案文件,如.zip、....
Minio是一个基于Apache License v2.0下的对象存储服务,兼容Amazon S3云存储服务。它最适合存储非结构化数据,如照片、视频、日志文件、备份和容器/VM映像。对象的大小可以从几KB到最大5TB。服务端可以通过Web访问,...