如何使用 ID 参数作为容器将多个文件上传到 Azure Blob 存储?

问题描述 投票:0回答:3

我已在 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. 检查是否存在与ID相同的容器 传入的参数,如果不存在则创建。
  2. 将文件上传到现有或新创建的目录,并为其添加 ID 前缀,即“_”。
azure model-view-controller kendo-ui azure-blob-storage
3个回答
2
投票

正如 Gaurav Mantri 上面所说,我们需要使用 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的信息,我们可以参考:

快速入门存储 SDK


2
投票

要在 Azure 存储中上传 blob,您需要使用 Azure 存储 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);
      }
  }

0
投票

要将多个文件上传到 Azure Blob 存储,您可以考虑使用预签名 URL,它允许从前端直接上传。这简化了后端逻辑并提高了效率。欲了解更多详情,请查看以下链接。

预签名 uls

© www.soinside.com 2019 - 2024. All rights reserved.