Welcome to Azure. Да давай уже про блобы!

Я уже столько рекламировал блобы и все вокргу них. А вот ничего особенного про них я ещё не сказал. Мы почти все знаем про блобы, а вот как блобы попадают в контейнеры до сих пор не ясно. И самое страшное — я не нашел цитаты с которой начать этот пост:)

Итак, мы уже много раз сказали что все сервисы хранения данных работают через REST API. Опять же, в прошлом посте мы увидели что с сервисами хранилища данных можно работать через библиотеки — НО библиотека СДК это только обертка над REST API. Теперь представим ситуацию — комманда разработчиков сервисов хранения данных когда будет добавлять функциональности — обновит вначале интерфейс REST API , обновления СДК ж будет произведенно гораздо позже. Потому я очень реккомендую Вам вначале посмотреть что такое REST, потом как взаимодействовать с REST API сервисов хранения данных Ажура, и уже только потом смотреть что нам предоставляет SDK.

REST (сокр. англ. Representational State Transfer, «передача состояния представления») — подход к архитектуре сетевых протоколов, обеспечивающих доступ к информационным ресурсам. Был описан и популяризован в 2000 году Ройем Филдингом (Roy Fielding), одним из создателей протокола HTTP. Самой известной системой, построенной в значительной степени по архитектуре REST, является современная Всемирная паутина.
Wikipedia(c)

Как начало нашего путешествия, я прегдлагаю (как и книга «Azure in Action» 🙂 ), написать небольшое приложение которое с помощью REST API выдаст нам лист блобов, которые созданны в сервисах хранения данных.

        /// <summary>
        /// Mains the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        static void Main(string[] args)
        {
            HttpWebRequest hwr = CreateHttpRequest(new Uri(@"http://127.0.0.1:10000/?comp=list"), "GET",
                new TimeSpan(0, 0, 30));
            using (StreamReader sr = new StreamReader(hwr.GetResponse().GetResponseStream()))
            {
                XDocument myDocument = XDocument.Parse(sr.ReadToEnd());
                Console.Write(myDocument.ToString());
            }
            Console.ReadKey();
        }

        /// <summary>
        /// Creates the HTTP request.
        /// </summary>
        /// <param name="uri">The URI.</param>
        /// <param name="httpMethod">The HTTP method.</param>
        /// <param name="timeout">The timeout.</param>
        /// <returns></returns>
        private static HttpWebRequest CreateHttpRequest(Uri uri, string httpMethod, TimeSpan timeout)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
            request.Timeout = (int)timeout.TotalMilliseconds;
            request.ReadWriteTimeout = (int)timeout.TotalMilliseconds;
            request.Method = httpMethod;
            request.ContentLength = 0;
            request.Headers.Add("x-ms-date",
            DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture));
            request.Headers.Add("x-ms-version", "2009-09-19");
            return request;
        }

Слегка много кода, правда:) Но это правда жизни — если Вы будете использовать API напрямую — кода будет много но вам не надо ждать пока выйдет новая версия сдк. Собственно у Вас конечно есть другой выход — создать свою обертку над REST API и обновлять эту обертку в случае если апи ажура поменяется.
Как видно с кода, мы создаем GET запрос для того чтобы получить эти данные. URI — который используется:
http://127.0.0.1:10000/?comp=list — с помощью этого урла мы получим список контейнеров, если же мы хотим получить список блобов, то сотит использовать аддресс типа: http://127.0.0.1:10000/nameofthecontainer?comp=list.
Также очень многих может удивить дата 19 сентября 2009 года — это указатель на дату версии апи которое стоит использовать. Тоесть если у вас что-то не работает, то стоит проверить именну эту дату в первую очередь.

Это был пример который показывает что данные с сервисов хранения Ажура можна получать не только с помощью библиотек, но и через REST API.
Теперь давайте перейдем к библиотеке:)

Для начала, чтобы получить тот же самые лист блобов через библиотеку нужно использовать такой код:

   /// <summary>
        /// Handles the Click event of the Button1 control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            SetConfiguration();
            CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("testConnectionString");
            CloudBlobClient blobClient = account.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("newcontainer");

            var blobs = container.ListBlobs();

            foreach (var blob in blobs)
            {
                Response.Write(blob.Uri);
            }
        }

Ну теперь давайте сделаем ход конем — сделаем то, чего так давно ждали!

        /// <summary>
        /// Handles the Click event of the Button1 control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            SetConfiguration();
            CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("testConnectionString");
            CloudBlobClient blobClient = account.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("newcontainer");
            var blob = container.GetBlobReference("newblob.txt");
            blob.UploadByteArray(new byte[] { 32, 32, 23 });
        }

Да! Наконец — то блоб у нас! Мы столько шли и учили инфу про блобы чтобы наконец то записать в сервисы хранения данных пару байт! Но ничего — теперь все пойдет как по маслу!
Как видите на этот раз мы создали объект blob. Что может этот объект? А точнее как мы можем загружать файлы в сервис?

Мы можем использовать такие методы:
UploadByteArray — понятно из названия, что данный метод позволяет нам загржуать определенный массив байтов в сервисы хранения данных.
UploadFile — принимает как параметр путь к файлу и именно его загружает
UploadText — не поверите:) Записывает в блобы текст
uploadFromStream — позволяет использовать для загрузки потоки
Максимальный объем блоба — 1 терабайт — думаю хватит на любой файл. Самое интересное, что если вы будете использовать библиотеку — то если Ваш блоб будет более 64 мегабайт — блоб будет разбит на блобы по 4 мб. Очень удобно, в случае если мы захотим создавать видеохостинг и предоставлять потоковое видео.

Записали? Давайте удалим!

        /// <summary>
        /// Handles the Click event of the Button1 control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            SetConfiguration();
            CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("testConnectionString");
            CloudBlobClient blobClient = account.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("newcontainer");
            var blob = container.GetBlobReference("newblob.txt");
            blob.Delete();
        }

Очевидно что удаление происходит с помощью метода Delete. Есть ещё один очень замечательный метод DeleteIfExist который возвращает нам булевое значение сообщающее или блоб был удален. Даже объяснить нечего:)

Ну и давайте попробуем скачать.
Если мы записали блоб в публичном контейнере — то чтобы скачать — можно просто дать ссылку на наш блоб. Например , если у нас был контейнер с именем mycontainer и блоб с именем mymusic.mp3 — то аддресс будет вот такой:
127.0.0.1:10000\mycontainer\mymusic.mp3.

Если у нас контейнер приватный, или мы просто хотим сделать это с кода, то стоит воспользоваться таким кодом:

  /// <summary>
        /// Handles the Click event of the Button1 control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            SetConfiguration();
            CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("testConnectionString");
            CloudBlobClient blobClient = account.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("newcontainer");
            string blobname = "newblob.txt";
            var blob = container.GetBlobReference(blobname);
            using (var ms = new MemoryStream())
            {
                blob.DownloadToStream(ms);
                Response.ContentType = blob.Properties.ContentType;
                Response.AddHeader("Content-Disposition",
                "attachment; filename=newblob.txt");
                Response.BinaryWrite(ms.ToArray());
            }
        }

Блобы можна загружать как потоками, так и В файл, так и обычным тесктом.
На этом пока все, блобами мы оперировать уже научились , в следующем посте поговорим о том , как можна это все счастье использовать:)

2 комментария на “Welcome to Azure. Да давай уже про блобы!

Оставьте комментарий