如何在没有文件路径的情况下将文件上传到 Azure Blob 存储容器的根目录

Posted

技术标签:

【中文标题】如何在没有文件路径的情况下将文件上传到 Azure Blob 存储容器的根目录【英文标题】:How to upload files to the root of a Azure Blob Storage container without the file path 【发布时间】:2020-01-28 18:39:07 【问题描述】:

下面的代码能够将指定目录localPath 中的文件上传到 Azure Blob 存储容器。问题是文件没有放在容器的根目录下,而是创建了与localPath变量定义的文件路径匹配的文件夹。

string localPath = @"C:\example\path\to\files";

生成的 blob 容器如下所示。

.
+-- example
|   +-- path
|       +-- to
|           +-- files
|               +-- file1.json
|               +-- file2.json
|               +-- file3.json
|               +-- file4.json
|               +-- file5.json

需要对以下代码进行哪些更改,以便将文件移动到容器的根目录,而不是在与 localPath 匹配的文件夹结构中?

Program.cs

namespace AzureBlobStorageFileTransfer

    using Microsoft.Azure.Storage;
    using Microsoft.Azure.Storage.Blob;
    using System;
    using System.IO;
    using System.Threading.Tasks;

    public static class Program
    
        public static void Main()
        
            ProcessAsync().GetAwaiter().GetResult();
        

        private static async Task ProcessAsync()
        
            CloudStorageAccount storageAccount = null;
            CloudBlobContainer cloudBlobContainer = null;
            string storageConnectionString = Environment.GetEnvironmentVariable("storageconnectionstring");

            if (CloudStorageAccount.TryParse(storageConnectionString, out storageAccount))
            
                try
                
                    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
                    cloudBlobContainer = cloudBlobClient.GetContainerReference("example");

                    BlobContainerPermissions permissions = new BlobContainerPermissions
                    
                        PublicAccess = BlobContainerPublicAccessType.Blob
                    ;
                    await cloudBlobContainer.SetPermissionsAsync(permissions);

                    string localPath = @"C:\example\path\to\files";
                    var txtFiles = Directory.EnumerateFiles(localPath, "*.json");

                    foreach (string currentFile in txtFiles)
                    
                        CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(currentFile);
                        await cloudBlockBlob.UploadFromFileAsync(currentFile);
                    

                
                catch (StorageException ex)
                
                    Console.WriteLine("Error returned from the service: 0", ex.Message);
                
            
            else
            
                Console.WriteLine(
                    "A connection string has not been defined in the system environment variables. " +
                    "Add a environment variable named 'storageconnectionstring' with your storage " +
                    "connection string as a value.");
            
        
    

【问题讨论】:

【参考方案1】:

您可以将Path.GetFileName(currentFile) 传递给cloudBlobContainer.GetBlockBlobReference 来完成此操作:

foreach (string currentFile in txtFiles)

    string currentFileName = Path.GetFileName(currentFile);
    CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(currentFileName);
    await cloudBlockBlob.UploadFromFileAsync(currentFile);

【讨论】:

以上是关于如何在没有文件路径的情况下将文件上传到 Azure Blob 存储容器的根目录的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 XCode 的情况下将具有应用内购买的现有 .ipa 文件上传到 ituneconnect

如何在没有表单的情况下将图像上传到节点 js 服务器?

我可以在没有内容长度标头的情况下将文件上传到 S3 吗?

您可以在没有 Mac 的情况下将 .ipa 文件上传到 Testflight 吗?

如何在没有任何数据库的情况下将用户上传的文件缓存在我的网站中

如何在不包含节点模块文件夹的情况下将我的 React 项目上传到 GitHub [重复]