【问题标题】:Upload images/files to blob azure, via web api ASP.NET framework Web application c#通过 web api ASP.NET 框架 Web 应用程序 c# 将图像/文件上传到 blob azure
【发布时间】:2021-02-03 17:07:10
【问题描述】:

获取http 400,尝试将图像上传到blob时,使用邮递员测试api:

 [Route("~/api/myAPI/testapi")]
 [HttpPost]
 public async Task<HttpResponseMessage> testapi()
 {
     String strorageconn = System.Configuration.ConfigurationManager.AppSettings.Get("MyBlobStorageConnectionString");
     Dictionary<string, object> dict = new Dictionary<string, object>(); 

     try  
     {  
         // Create a CloudStorageAccount object using account name and key.
         // The account name should be just the name of a Storage Account, not a URI, and 
         // not including the suffix. The key should be a base-64 encoded string that you
         // can acquire from the portal, or from the management plane.
         // This will have full permissions to all operations on the account.
        // StorageCredentials storageCredentials = new StorageCredentials(myAccountName, myAccountKey);
         //CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(storageCredentials, useHttps: true);
         // Parse the connection string and return a reference to the storage account.
         CloudStorageAccount storageAccount = CloudStorageAccount.Parse(strorageconn);
            
         // If the connection string is valid, proceed with operations against Blob
         // storage here.
         // ADD OTHER OPERATIONS HERE
         // Create the CloudBlobClient that represents the 
         // Blob storage endpoint for the storage account.
         CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
         // Create a container called 'quickstartblobs' and 
         // append a GUID value to it to make the name unique.
         CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("images"); 
         //"quickstartblobs" + Guid.NewGuid().ToString());
         await cloudBlobContainer.CreateAsync();
         if (cloudBlobContainer.CreateIfNotExists())
         {
             cloudBlobContainer.SetPermissions(
                 new BlobContainerPermissions
                 {
                     PublicAccess = BlobContainerPublicAccessType.Blob
                 });
         }
         // Set the permissions so the blobs are public.
        /* BlobContainerPermissions permissions = new BlobContainerPermissions
         {
             PublicAccess = BlobContainerPublicAccessType.Blob
         };
         await cloudBlobContainer.SetPermissionsAsync(permissions); */
            
             // Create a CloudBlobClient object from the storage account.
             // This object is the root object for all operations on the 
             // blob service for this particular account.
             //CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
             var httpRequest = HttpContext.Current.Request;         
             foreach (string file in httpRequest.Files)  
             {  
                 HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);  

                 var postedFile = httpRequest.Files[file]; 
                 // Get a reference to a CloudBlobContainer object in this account. 
                 // This object can be used to create the container on the service, 
                 // list blobs, delete the container, etc. This operation does not make a 
                 // call to the Azure Storage service.  It neither creates the container 
                 // on the service, nor validates its existence.
                 string imageName = "images" +serverTime.Year.ToString() + serverTime.Month.ToString() + serverTime.Day.ToString() + 
                                             serverTime.Hour.ToString() + serverTime.Minute.ToString() + serverTime.Second.ToString () 
                                             + postedFile.FileName.ToLower();
                 //CloudBlobContainer container = blobClient.GetContainerReference(imageName.ToLower());
                 /*if(await container.CreateIfNotExistsAsync())  
                 {  
                     await container.SetPermissionsAsync(  
                         new BlobContainerPermissions {  
                             PublicAccess = BlobContainerPublicAccessType.Blob  
                         }  
                         );  
                 }  */

                 if (postedFile != null && postedFile.ContentLength > 0)  
                 {  

                     int MaxContentLength = 1024 * 1024 * 1; //Size = 1 MB  

                     IList<string> AllowedFileExtensions = new List<string> { ".jpg", ".gif", ".png" };  
                     var ext = postedFile.FileName.Substring(postedFile.FileName.LastIndexOf('.'));  
                     var extension = ext.ToLower();  
                     if (!AllowedFileExtensions.Contains(extension))  
                     {  

                         var message = string.Format("Please Upload image of type .jpg,.gif,.png.");  

                         dict.Add("error", message);  
                         return Request.CreateResponse(HttpStatusCode.BadRequest, dict);  
                     }  
                     else if (postedFile.ContentLength > MaxContentLength)  
                     {  

                         var message = string.Format("Please Upload a file upto 1 mb.");  

                         dict.Add("error", message);  
                         return Request.CreateResponse(HttpStatusCode.BadRequest, dict);  
                     }  
                     else  
                     {  

                         

                         var filePath = HttpContext.Current.Server.MapPath("~/imagesfiles/uploads" + postedFile.FileName.ToLower() + extension.ToLower());  
                        
                         postedFile.SaveAs(filePath);  
                         //CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference(imageName);  
                         // Get a reference to the blob address, then upload the file to the blob.
                         // Use the value of localFileName for the blob name.
                         CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(imageName.ToLower());
                        
                          // create a blob in container and upload image bytes to it
                         //var blob =container.GetBlobReference(postedFile.FileName);
                         await cloudBlockBlob.UploadFromFileAsync(postedFile.FileName);
                         //await cloudBlockBlob.UploadFromFileAsync(filePath); 

                     }  
                 }
                 var message1 = string.Format("Image Updated Successfully.");
                 return Request.CreateErrorResponse(HttpStatusCode.Created, message1); ;
             }
            
           
             var res = string.Format("Please Upload a image.");
             dict.Add("error", res);
             return Request.CreateResponse(HttpStatusCode.NotFound, dict);
            
     }  
     catch (Exception ex)  
     {
         HttpResponseMessage response2 = Request.CreateResponse(HttpStatusCode.BadRequest, ex.InnerException.ToString());
         return response2;
     }  
 }

邮递员的回应:

"System.Net.WebException: The remote server returned an error: (400) Bad Request.\r\n at Microsoft.Azure.Storage.Shared.Protocol.HttpResponseParsers.ProcessExpectedStatusCodeNoException[T](HttpStatusCode expectedStatusCode, HttpStatusCode actualStatusCode, T retVal, StorageCommandBase`1 cmd, Exception ex)\r\n at Microsoft.Azure.Storage.Blob.CloudBlobContainer.<>c_DisplayClass149_0.<CreateContainerImpl>b_2(RESTCommand`1 cmd, HttpWebResponse resp, Exception ex, OperationContext ctx)\r\n at Microsoft.Azure.Storage.Core.Executor.Executor.EndGetResponse[T](IAsyncResult getResponseResult)"

【问题讨论】:

    标签: c# azure asp.net-web-api file-upload azure-blob-storage


    【解决方案1】:

    不知道为什么它不起作用,代码看起来是正确的。错误发生在很多情况下。

    1. 如果您请求一个名称无效的容器,则会导致 (400) Bad Request,您将得到该请求。它有一些关于容器名称的limitations,因此请检查您的字符串。

    2. 如果 Blob 存储模拟器无法启动,它将返回 400 Bad Request。见here

    3. 如果存储库和存储模拟器的版本不同步,也会返回400 Bad Request,见here

    4. 最后,您的存储位置可能很重要,请参阅here

    【讨论】:

    • 我使用 web api asp.net web 应用程序,而不是 Core asp。网,有什么不同吗?
    • 你试过我提到的方法了吗?错误始终与设置有关,与代码无关。
    • 我一直在尝试以某种方式是的......好吧,我使用的是 2013 视觉工作室,无法使用 v12 和 v11,所以现在我使用了 2019 视觉工作室并获得以下异常:Http 500 {“消息”: "发生错误。","ExceptionMessage":"对象引用未设置为对象的实例。","ExceptionType":"System.NullReferenceException","StackTrace":" at worldcuisines.Controllers.myAPIController.d__30。 MoveNext() in
    • C:\\Users\\chris\\source\\repos\\worldcuisines\\worldcuisines\\Controllers\\myAPIController.cs:line 1843\r\n--- 堆栈跟踪结束从先前引发异常的位置 ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n在
    • System.Threading.Tasks.TaskHelpersExtensions.d__1`1.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪---\r\n 在系统.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Web.Http.Controllers.ApiControllerActionInvoker.d__1.MoveNext() \r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 在
    【解决方案2】:

    感谢 Pamela Peng,我能够面对不同的异常并找到问题。

    第一个问题是版本,所以我更改为 Visual Studio 2019,并且必须添加正确的参考。另一个问题出在代码中,所以我更新了 else :

                            else
                            {
                                CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(imageName);
                                cloudBlockBlob.Properties.ContentType = postedFile.ContentType;
                                await cloudBlockBlob.UploadFromStreamAsync(postedFile.InputStream);
                            } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 2017-07-10
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2012-08-05
      • 2012-12-26
      • 2020-09-21
      相关资源
      最近更新 更多