2017-02-21 4 views
0

Azure BLOB에 파일을 업로드해야합니다. 아래 그림과 같이 시도했습니다.하지만 작동하지 않습니다. 내가 잘못했음을 알았습니다. 이전에는 파일 시스템을 사용했습니다. 저장 이미지.하지만 이제는 Blob에 저장해야합니다.Web Api를 사용하여 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); 
        } 
       } 
      }; 

스택 추적

at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 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, Nullable 1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 397 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream(Stream source, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 295 at Joshi.IP.WebApi.Controllers.PictureController.d__0.MoveNext() in D:\my\my.WebApi\WebApi\Controllers\PictureController.cs:line 116

예외 메시지 :

enter image description here

+0

당신은 작동하지 않습니다 '가 무슨 뜻 이죠 '? 오류가 있습니까? –

+0

어떤 버전의 MVC를 사용하고 있습니까? 나는 MVC 4를 추측하고 있나? – Svek

+0

ASP.net MVC 5 및 웹 API 5 @Svek – Sampath

답변

1

귀하의 스토리지 계정이 ippictures라고

The remote server returned an error: (404) Not Found.

물방울 용기,하지만 컨테이너는 ippictures라고합니다. 코드에서는 blobClient.GetContainerReference("ippictures"); 대신 blobClient.GetContainerReference("ip-pictures");으로 할

당신은 지정된 컨테이너가 존재하는지 여부를 확인하여 이러한 상황 종류의 안전망을 추가 할 수

:

var container = blobClient.GetContainerReference("ip-pictures"); 
container.CreateIfNotExists() 
+0

고맙습니다. :) – Sampath

관련 문제