Отправка файлов в большой двоичный объект Azure с помощью веб-API

Мне нужно загрузить файлы в BLOB-объект Azure. Я пробовал, как показано ниже, но это не сработало. Надеюсь, я делаю это неправильно. Раньше я использовал файловую систему для хранения изображений. Но теперь мне нужно хранить его в Blob.

Примечание: blockBlob.UploadFromStream(filestream);//after this point it doesn't work

Метод веб-API

[HttpPost]
public async Task<HttpResponseMessage> AddPictures()
   {
       if (!Request.Content.IsMimeMultipartContent())
        {
          Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
        }

        var newImageName = string.Empty;
        var path = System.Web.Hosting.HostingEnvironment.MapPath("~");
        var provider = GetMultipartProvider();
        await Request.Content.ReadAsMultipartAsync(provider);

         foreach (var r in provider.FileData)
          {
              var uploadedFileInfo = new FileInfo(r.LocalFileName);
              var originalFileName = GetDeserializedFileName(r);
              var extension = Path.GetExtension(originalFileName);
              if (extension == null) continue;

              var ext = extension.ToLower();
              var guid = Guid.NewGuid().ToString();
              newImageName = guid + ext;

              var storageAccount = new CloudStorageAccount(new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials("pictures", "key"),true);

              // Create the blob client.
              var blobClient = storageAccount.CreateCloudBlobClient();

              // Retrieve reference to a previously created container.
              var container = blobClient.GetContainerReference("ippictures");

              // Retrieve reference to a blob named "myblob".
              var blockBlob = container.GetBlockBlobReference(newImageName);

              using (var filestream = File.OpenRead(r.LocalFileName))
              {
                 blockBlob.UploadFromStream(filestream);//after this point it doesn't work
              }
              File.Delete(r.LocalFileName);

          }
              return Request.CreateResponse(HttpStatusCode.OK, new { newImageName });
       }

Метод AngularJS

           //to add Pictures
            vm.addPictures = function ($files, errFiles) {
                vm.upload = [];
                vm.errFiles = errFiles;
                if ($files && $files.length) {
                    //$files: an array of files selected, each file has name, size, and type
                    for (var i = 0; i < $files.length; i++) {
                        var $file = $files[i];
                        (function (index) {
                            vm.upload[index] = upload.upload({
                                url: "/api/Picture/AddPictures",
                                method: "POST",
                                data: {},
                                file: $file
                            }).progress(function () {
                            }).success(function (data) {
                                vm.pictureList.push({
                                    id: vm.pictureList.length + 1,
                                    url: '/common/pictures/' + data.newImageName,
                                    note: '',
                                    isSelected: true,
                                });

                            }).error(function () {
                            });
                        })(i);
                    }
                }
            };

Трассировка стека

в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (длина RESTCommand1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 604 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper(Stream source, Nullable1, AccessCondition accessCondition, параметры BlobRequestOptions, OperationContext operationContext) в c: \ Program Files (x86) \ Jenkins \ workspace \ release_dotnet_master \ Releaserary_dotnet_master \ Blob \ CloudBlockBlob.cs: строка 397 в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream (источник потока, AccessCondition accessCondition, параметры BlobRequestOptions, OperationContext operationContext) в c: \ Program Files (x86) \ Jenkins \ workspace \ release_dotnet_master \ ClassLibraryCommon \ Blob \ CloudBlockBlob.cs: строка 295 в Joshi.IP.WebApi.Controllers.PictureController.d__0.MoveNext () в D: \ my \ my.WebApi \ WebApi \ Controllers \ PictureController.cs: строка 116

Сообщение об исключении:

Удаленный сервер возвратил ошибку: (404) Не найдено.

Контейнер больших двоичных объектов

введите здесь описание изображения


person Sampath    schedule 21.02.2017    source источник
comment
Что вы имеете в виду под «не работает»? У вас есть ошибки?   -  person Peter Bons    schedule 21.02.2017
comment
какую версию MVC вы используете? Я предполагаю MVC 4?   -  person Svek    schedule 21.02.2017
comment
ASP.net MVC 5 и веб-API 5 @Svek   -  person Sampath    schedule 21.02.2017
comment
пожалуйста, посмотрите трассировку стека @PeterBons   -  person Sampath    schedule 21.02.2017
comment
Можете ли вы также опубликовать сообщение об исключении?   -  person Peter Bons    schedule 21.02.2017
comment
Я обновил его. Пожалуйста, обратите внимание, что @PeterBons   -  person Sampath    schedule 21.02.2017
comment
Существует ли контейнер ippictures? Если нет, добавьте container.CreateIfNotExists() после получения ссылки на контейнер   -  person Peter Bons    schedule 21.02.2017
comment
он есть. пожалуйста, посмотрите изображение @PeterBons   -  person Sampath    schedule 21.02.2017
comment
Ваша учетная запись хранения называется ippictures, а контейнер называется ip-pictures. В вашем коде вы делаете blobClient.GetContainerReference("ippictures"); вместо blobClient.GetContainerReference("ip-pictures");   -  person Peter Bons    schedule 21.02.2017
comment
Да, друг. Ты прав. Мой Плохой. Не могли бы вы выразить это в качестве ответа. Тогда я могу закрыть этот пост. Большое спасибо :) @PeterBons   -  person Sampath    schedule 21.02.2017


Ответы (1)


Ваша учетная запись хранения называется ippictures, а контейнер называется ip-pictures. В вашем коде вы делаете blobClient.GetContainerReference("ippictures"); вместо blobClient.GetContainerReference("ip-pictures");

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

var container = blobClient.GetContainerReference("ip-pictures");
container.CreateIfNotExists() 
person Peter Bons    schedule 21.02.2017