Upload images/files to blob azure, via web api ASP.NET framework Web application

Christos Vasili 101 Reputation points
2020-10-18T16:44:22.297+00:00

[33068-webapiconfigcs.txt][1][33048-blob-api-upload.txt][2][33142-blob-api-upload2.txt][3][33143-blobstoragemultipartstreamprovidercs.txt][4] [2]: /api/attachments/33048-blob-api-upload.txtI?platform=QnA am using Visual Studio 2013, ASP.NET web api framework c#

Azure Blob Storage
Azure Blob Storage
An Azure service that stores unstructured data in the cloud as blobs.
2,511 questions
0 comments No comments
{count} votes

Accepted answer
  1. Christos Vasili 101 Reputation points
    2020-10-22T19:16:13.43+00:00

    I fixed the code and works as expected now, but before that, the issue was with visual studio 2013, had to use visual studio 2019, and get the correct version reference of Azure:

        [Route("~/api/myAPI/testapi")]
        [HttpPost]
        public async Task<HttpResponseMessage> testapi()
        {
    
            CloudStorageAccount storageAccount;
            Dictionary<string, object> dict = new Dictionary<string, object>();
    
            string strorageconn = ConfigurationManager.AppSettings.Get("MyBlobStorageConnectionString");
    
            if (CloudStorageAccount.TryParse(strorageconn, out storageAccount))
            {
    
                try
                {
    
                    // 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");
                    await cloudBlobContainer.CreateIfNotExistsAsync();
    
    
                    // Set the permissions so the blobs are public.
                    BlobContainerPermissions permissions = new BlobContainerPermissions
                    {
                        PublicAccess = BlobContainerPublicAccessType.Blob
                    };
                    await cloudBlobContainer.SetPermissionsAsync(permissions);
    
    
    
    
    
                    var httpRequest = HttpContext.Current.Request;
                    foreach (string file in httpRequest.Files)
                    {
    
                        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
    
                        var postedFile = httpRequest.Files[file];
    
    
                        string imageName = ("images" + serverTime.Year.ToString() + serverTime.Month.ToString() + serverTime.Day.ToString() +
                                                    serverTime.Hour.ToString() + serverTime.Minute.ToString() + serverTime.Second.ToString() + serverTime.Millisecond.ToString()
                                                    + postedFile.FileName );
    
    
                        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
                            {
                                CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(imageName);
                                cloudBlockBlob.Properties.ContentType = postedFile.ContentType;
                                await cloudBlockBlob.UploadFromStreamAsync(postedFile.InputStream);
                            }
                        }
    
                        var message1 = string.Format("Image Updated Successfully.");
                        return Request.CreateErrorResponse(HttpStatusCode.Created, message1);
                    }
                    var res3 = string.Format("Please Upload a image.");
                    dict.Add("error", res3);
                    return Request.CreateResponse(HttpStatusCode.NotFound, dict);
    
    
    
    
                }
                catch (Exception ex)
                {
                    HttpResponseMessage response2 = Request.CreateResponse(HttpStatusCode.BadRequest, ex.InnerException.ToString());
                    return response2;
                }
    
    
            }
            else
            {
                var res = string.Format("Did not connect successfull.");
                dict.Add("error", res);
                return Request.CreateResponse(HttpStatusCode.NotFound, dict);
            }
        }
    
    1 person found this answer helpful.
    0 comments No comments

2 additional answers

Sort by: Most helpful
  1. deherman-MSFT 34,041 Reputation points Microsoft Employee
    2020-10-19T16:13:08.083+00:00

    @Christos Vasili Apologies for the delay in responding here and any inconvenience it may have caused.

    In line 35 of 33048-blob-api-upload.txt it looks like you intended to comment out a portion of the code but it wasn't moved to another line. Please try correcting this to see if it resolves your error.

    -------------------

    Please don’t forget to "Accept the answer" and “up-vote” wherever the information provided helps you, this can be beneficial to other community members.

    0 comments No comments

  2. Christos Vasili 101 Reputation points
    2020-10-19T16:54:37.893+00:00

    Hi I modified that Api as below, but still getting HTTP40033296-blob-api-upload.txt

    Code of one of the APIs:

        [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;  
            }    
        }  
    

    Response from postman:

    "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, StorageCommandBase1 cmd, Exception ex)\r\n at Microsoft.Azure.Storage.Blob.CloudBlobContainer.<>c__DisplayClass149_0.<CreateContainerImpl>b__2(RESTCommand1 cmd, HttpWebResponse resp, Exception ex, OperationContext ctx)\r\n at Microsoft.Azure.Storage.Core.Executor.Executor.EndGetResponseT"