Недавно передо мной встала задача использования в своем приложении облачного хранилища. Не сталкивавшись с подобным ранее, я думал что эта задача займет больше времени. Но, на мое удивление, уже разработаны достаточно удобные инструменты для взаимодействия. Пример с их использованием описан в данном топике.
Рассмотрим как хранятся файлы на амазоне: у нас есть Корзины(Buckets), непосредственно в которые можно загружать файлы и создавать в них директории. Для доступа используется два ключа Access Key и Secret Key, посмотреть которые можно на отдельной страничке профиля.
Итак, перед нами задача, реализовать в своем приложении возможность загружать файлы и удалять уже загруженные. Создадим новый Windows Forms проект. Добавим с помощью NuGet Amazon SDK
PM> Install-Package AWSSDK
Добавим на нашу форму два ListBox’a: один для отображения списка корзин, второй для отображения списка файлов в выбранной корзине. Также добавим кнопки для получения списков и загрузки файла в указанную корзину и удаления выбранного файла:
Добавим строки с ключами
string accessKey = "LASKDJFHGQPWOEIRUTY";
string secretKey = "laksdjfhgqpwoeirutyzmxncbv";
И рассмотрим код для получения списка корзин:
private void btnGetBucket_Click(object sender, EventArgs e)
{
using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
var list = client.ListBuckets();
foreach (var bucket in list.Buckets)
{
lbBuckets.Items.Add(bucket.BucketName);
}
}
}
Как видим, здесь нет ничего сложного: создаем объект клиента и вызываем у него нужный метод. Стоит отметить, что помимо имени корзины еще имеется информации о дате создания.
Код для получения списка файлов и каталогов в выбранной корзине:
private void btnGetList_Click(object sender, EventArgs e)
{
using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
if(lbBuckets.SelectedIndex < 0)
return;
var list = client.ListObjects(
new ListObjectsRequest()
{
BucketName = lbBuckets.SelectedItem.ToString()
});
foreach (var file in list.S3Objects)
{
lbFiles.Items.Add(file.Key);
}
}
}
На выходе мы получаем готовый список S3Objects, соответствующие файлам. Также можно получить «сырой» ответ в виде XML, имеющий следующий формат:
<?xml version="1.0" encoding="utf-16"?>
<ListObjectsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<RequestId>Id</RequestId>
<AmazonId2>Id</AmazonId2>
<Name>Name</Name>
<Prefix />
<S3Objects>
<Key>FileName</Key>
<BucketName>BucketName</BucketName>
<LastModified>Ср, 20 июн 2012 13:00:33 GMT</LastModified>
<ETag>"tag"</ETag>
<Size>0</Size>
<Owner>
<Id>OwnerId</Id>
<DisplayName>OwnerName</DisplayName>
</Owner>
<StorageClass>STANDARD</StorageClass>
</S3Objects>
<MaxKeys>1000</MaxKeys>
<IsTruncated>false</IsTruncated>
</ListObjectsResponse>
Ну и код отправки файла:
private void btnUpload_Click(object sender, EventArgs e)
{
var dlg = new OpenFileDialog();
if(dlg.ShowDialog() == DialogResult.OK)
{
var stream = new FileStream(dlg.FileName, FileMode.Open);
using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
var request = new PutObjectRequest();
if (lbBuckets.SelectedIndex < 0)
return;
request
.WithBucketName(lbBuckets.SelectedItem.ToString())
.WithCannedACL(S3CannedACL.PublicRead)
.WithKey(Path.GetFileName(dlg.FileName))
.InputStream = stream;
client.PutObject(request);
}
}
}
Здесь загружаемому файлу можно указать в какую корзину его загружать, какие настройки приватности. Для загрузки файла в директорию корзины, достаточно добавить в путь имя директории через слеш. Если указанная директория отсутствует, то она будет создана.
Ну и код удаления:
private void btnDelete_Click(object sender, EventArgs e)
{
using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
if (lbFiles.SelectedIndex < 0)
return;
new DeleteObjectRequest()
.WithBucketName(lbBuckets.SelectedItem.ToString())
.WithKey(lbFiles.SelectedItem.ToString());
}
}
Дополнительные материалы:
Getting Started with the AWS SDK for .NET
GDownload Source Code
Автор: vyacheslav_ka