PawelC
PawelC

Reputation: 1226

Azure Blob Storage - 404 when i save to file

I have another problem with Azure Blob Storage, this time with downloading. I get a list of files without a problem, unfortunately when I want to download it I get a 404 error that the file was not found.

using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

namespace BlobStorage
{
    class Program
    {
        static void Main(string[] args)
        {
            CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(
                "{connectionString}");

            var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
            var backupContainer = backupBlobClient.GetContainerReference("{container-name");

            var list = backupContainer.ListBlobs(useFlatBlobListing: true);

            foreach (var blob in list)
            {
                var blobFileName = blob.Uri.Segments.Last();
                CloudBlockBlob blockBlob = backupContainer.GetBlockBlobReference(blobFileName);

                string destinationPath = string.Format(@"D:\" + blobFileName +".txt");

                blockBlob.DownloadToFile(destinationPath, FileMode.OpenOrCreate);
            }
        }
    }
}

Error message:

Microsoft.WindowsAzure.Storage.StorageException: "The remote server returned an error: (404) Not found."

Internal exception WebException: The remote server returned an error: (404) Not found.

And points to the line:

blockBlob.DownloadToFile (destinationPath, FileMode.OpenOrCreate);

A file like this most exists in blob storage. When I enter the blob editions, copy the url to a file, I can download it through the browser without any problem. Unfortunately, I can not download it from the application level due to a 404 error.

Only why does such a file exist?

Upvotes: 0

Views: 2418

Answers (1)

Gaurav Mantri
Gaurav Mantri

Reputation: 136306

The issue is how you're getting the blob name in the following line of code:

var blobFileName = blob.Uri.Segments.Last();

Considering, the path is tempdata/ExampleIotHub/02/2019/05/14/39, the blob's name is ExampleIotHub/02/2019/05/14/39 (assuming your container name is tempdata) however the blobFileName you're getting is just 39 (please see examples here). Since there is no blob by the name 39, you're getting this 404 error.

I suggest you try by doing something like the following:

foreach (var blob in list)
{
    var localFileName = blob.Uri.Segments.Last();
    CloudBlockBlob blockBlob = blob as CloudBlockBlob;
    if (blockBlob != null)
    {
      string destinationPath = string.Format(@"D:\" + localFileName +".txt");

      blockBlob.DownloadToFile(destinationPath, FileMode.OpenOrCreate);
    }
}

Please note that I have not tried running this code so there may be some errors.

Upvotes: 1

Related Questions