Я уже столько рекламировал блобы и все вокргу них. А вот ничего особенного про них я ещё не сказал. Мы почти все знаем про блобы, а вот как блобы попадают в контейнеры до сих пор не ясно. И самое страшное — я не нашел цитаты с которой начать этот пост:)
Итак, мы уже много раз сказали что все сервисы хранения данных работают через 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()); } }
Блобы можна загружать как потоками, так и В файл, так и обычным тесктом.
На этом пока все, блобами мы оперировать уже научились , в следующем посте поговорим о том , как можна это все счастье использовать:)
Great blog! Do you have any tips for aspiring writers?
I’m hoping to start my own blog soon but I’m a little lost on everything.
Would you suggest starting with a free platform like WordPress or
go for a paid option? There are so many options out there that
I’m totally overwhelmed .. Any tips? Kudos!
НравитсяНравится
Hello There. I found your blog using msn. This is a very well written article.
I will make sure to bookmark it and come back to read more of your useful info.
Thanks for the post. I will definitely return.
НравитсяНравится