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 开发工具包。
什么是Amazon S3?
使用 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”是密钥。
常用操作
介绍到这里,直接贴代码
//申明变量
/**
* 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 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);
我也是刚刚使用,不详细的地方,请大家在API中查看