Как загрузить несколько файлов в хранилище BLOB-объектов Azure, используя параметр ID в качестве контейнера? - PullRequest
0 голосов
/ 22 мая 2018

Я создал учетную запись хранения в Azure для загрузки файлов в.Я использую асинхронный виджет загрузки KenoUI, который позволяет загружать несколько файлов.Я хотел бы, чтобы система создала контейнер на основе передаваемого параметра Id, если он еще не существует.

Я борюсь с фактической частью загрузки, однако, я 'Я не уверен, как передать перечисляемые файлы в учетную запись хранения.Вот мой код:

public ActionResult Async_Save(IEnumerable<HttpPostedFileBase> files, string id)
    {
        //Connect to Azure
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("my_AzureStorageConnectionString"));

        //Create Blob Client
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        //Retrieve a reference to a container
        CloudBlobContainer blobContainer = blobClient.GetContainerReference("vehicle_" + id);

        try
        {
            // Create the container if it doesn't already exist
            blobContainer.CreateIfNotExists();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.InnerException);

        }
        foreach (var file in files)
        {
            //This doesn't seem right to me and it's where I'm struggling
            var fileName = Path.GetFileName(file.FileName);
            var physicalPath = Path.Combine(blobContainer, fileName);
            file.SaveAs(physicalPath);
        }

        // Return an empty string to signify success
        return Content("");
    }

Я пытался создать метод, который подключается к моей учетной записи хранения Azure и:

  1. Проверьте наличиеКонтейнер с тем же идентификатором, что и переданный параметр, если он не существует, создайте его.
  2. Загрузите файлы в существующий или вновь созданный каталог и присвойте им префикс идентификатора, т.е._ ".

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Как сказал Гаурав Мантри выше, нам нужно будет использовать Azure Storage SDK.

Для повышения производительности мы можем сделать следующее:

Parallel.ForEach(files, file =>

{

    CloudBlockBlob blob = blobContainer.GetBlockBlobReference(file.FileName); 

    blob.UploadFromStream(file.InputStream);

    file.InputStream.Close();


});

Ваш код будет лучше, как показано ниже:

public ActionResult Async_Save(List<HttpPostedFileBase> files, string id)

{

// Connect to Azure

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("my_AzureStorageConnectionString"));

try

{

   //Create Blob Client

   CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

   //Retrieve a reference to a container

   CloudBlobContainer blobContainer = blobClient.GetContainerReference("vehicle_" + id);

   // Create the container if it doesn't already exist

   blobContainer.CreateIfNotExists();

   Parallel.ForEach(files, file =>

   {

       CloudBlockBlob blob = blobContainer.GetBlockBlobReference(file.FileName);

       blob.UploadFromStream(file.InputStream);

       file.InputStream.Close();

   });

}

catch (Exception ex)

{

    Console.WriteLine(ex.Message);

    Console.WriteLine(ex.InnerException);

} 

// Return an empty string to signify success

    return new ContentResult();

}

Дополнительные сведения об использовании Azure Storage SDK см. В следующих статьях:

Быстрый старт с помощью Storage SDK

0 голосов
/ 22 мая 2018

Чтобы загрузить большой двоичный объект в хранилище Azure, вам необходимо использовать Azure Storage SDK.

Пожалуйста, замените следующий код:

    foreach (var file in files)
    {
        //This doesn't seem right to me and it's where I'm struggling
        var fileName = Path.GetFileName(file.FileName);
        var physicalPath = Path.Combine(blobContainer, fileName);
        file.SaveAs(physicalPath);
    }

на что-то вроде:

  foreach (var file in files)
  {
      var blob = blobContainer.GetBlockBlobReference(file.FileName);
      using (var s = file.InputStream)
      {
          blob.UploadFromStream(s);
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...