Интегрируем Amazon S3 в .Net приложение

в 8:07, , рубрики: .net, amazon s3, Amazon Web Services, метки: , ,

Недавно передо мной встала задача использования в своем приложении облачного хранилища. Не сталкивавшись с подобным ранее, я думал что эта задача займет больше времени. Но, на мое удивление, уже разработаны достаточно удобные инструменты для взаимодействия. Пример с их использованием описан в данном топике.

Рассмотрим как хранятся файлы на амазоне: у нас есть Корзины(Buckets), непосредственно в которые можно загружать файлы и создавать в них директории. Для доступа используется два ключа Access Key и Secret Key, посмотреть которые можно на отдельной страничке профиля.
Итак, перед нами задача, реализовать в своем приложении возможность загружать файлы и удалять уже загруженные. Создадим новый Windows Forms проект. Добавим с помощью NuGet Amazon SDK

PM> Install-Package AWSSDK

Добавим на нашу форму два ListBox’a: один для отображения списка корзин, второй для отображения списка файлов в выбранной корзине. Также добавим кнопки для получения списков и загрузки файла в указанную корзину и удаления выбранного файла:
Интегрируем Amazon S3 в .Net приложение

Добавим строки с ключами

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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js