【问题标题】:How to save a file to a subfolder in an Azure blob container?如何将文件保存到 Azure Blob 容器中的子文件夹?
【发布时间】:2018-09-19 09:33:53
【问题描述】:

我正在尝试将图像保存到我们的 Azure 博客存储中。感谢通过代码 sn-p 下面的链接提供的有用响应,我能够成功地将文件保存到我们的顶级容器中。不幸的是,我希望将文件保存到该容器的子目录中。而且,为了我的一生,我无法让它发挥作用。

目前,图像正在保存到我们的“图像”容器中。在该容器中是一个文件夹,“成员”。我希望将文件保存到该子目录。所以“图像/成员”。我试图将“图像/成员”传递给 GetBlockBlobReference,但是文件根本没有保存(或者,至少我找不到它)。

这看起来应该很简单。提前致谢。

  CloudBlobClient blobClient = account.CreateCloudBlobClient();
  CloudBlobContainer container = blobClient.GetContainerReference("images");
  CloudBlockBlob blockBlob = container.GetBlockBlobReference(filename);
  blockBlob.UploadFromStream(stream);

Top-level container. The image with the Guid is one that I uploaded

The "members" directory. Sorted by most recent; nothing recent appearing

Helpful solution that got me to saving successfully to the top-level container

【问题讨论】:

  • 当您尝试“图像/成员”时发生了什么?你用什么来查看你的容器和blob。这个:azure.microsoft.com/en-us/features/storage-explorer?
  • 不要更改容器引用,将其保留为图像。您需要将块 blob 引用更改为“成员/文件名”
  • 使用 Azure 存储资源管理器查看容器。成员是一个现有的“目录”,其中已经保存了许多图像。在按照建议更改代码之前,我会看到我上传的文件保存到图像容器(在存储资源管理器中)。当我对建议的代码进行更改然后导航到成员“目录”时,我看到了所有旧图像。我使用“上次修改时间”,因为最近没有出现在文件列表的顶部。再次感谢!
  • 在容器“images”下使用带有前缀“members/”的 listBlobs 调用,您应该能够获取在 members 文件夹下创建的所有 blob。这就是存储资源管理器在向您显示文件时所做的事情。

标签: azure blob azure-blob-storage


【解决方案1】:

“images”是您的容器的名称。

你需要做的是改变这一行

CloudBlockBlob blockBlob = container.GetBlockBlobReference(filename);

CloudBlockBlob blockBlob = container.GetBlockBlobReference("members/" + filename);

然后您可以使用Azure Storage Explorer 查看您的文件和文件夹: https://azure.microsoft.com/en-us/features/storage-explorer/

【讨论】:

  • 我觉得这是正确的答案。但是,我进行了建议的更改,但我仍然没有在成员“文件夹”中看到图像。就像,我觉得我们正处于完成这项工作的边缘,但并非一直如此。不过,这个解决方案是有道理的!谢谢!
  • 如果这解决了您的问题,那么请@BoGoodSki 投票/接受答案或两者兼而有之。谢谢!
  • 我投了赞成票(但没有足够的代表来记录它)。我不接受它作为解决方案,因为文件仍然没有成为“成员”。不太清楚发生了什么。该解决方案是有道理的,在我看来它应该可以工作,但事实并非如此。一旦我得到它的功能,我会接受答案。
  • 它正在工作。我接受了这个解决方案。显然,我只需在存储资源管理器中单击“加载更多”大约 1000 次,就可以让最近添加的图像冒泡到顶部。
  • @BoGoodSki 我很高兴它能正常工作。是的,存储资源管理器使用一些最大值调用 ListBlob,您将需要根据需要加载更多。谢谢!
【解决方案2】:

在文件名中使用斜杠 (/) 将创建一个“文件夹”。我使用“文件夹”是因为它是一个虚拟文件夹,这是一个用来给我们人类提供文件夹概念的技巧。实际上只有一级分组,即Container

文件名中的每个斜杠 (/) 代表一个“文件夹”,因此使用文件名 firstFolder/secondFolder/filename.txt 创建一个 blob 将创建一个具有该确切名称的文件。它看起来像一个路径为firstFolder -> secondFolder 的文件。您可以在将useFlatBlob 设置为true 的情况下向ListBlobs 询问容器,从而返回特定容器中的所有blob。所以所有文件夹中的所有 Blob。

您还可以通过使用CloudBlobContainer.GetDirectoryReference 获取DirectoryReference 并在其中列出 blob 来请求虚拟文件夹中的所有 blob。

更多信息在这里:Work with Blob resources

【讨论】:

    【解决方案3】:

    你可以按照这段代码来做同样的事情。

    output = detected_anomaly.to_csv (encoding = "utf-8", index=False)
    blob_path = 'blobfolder1/blobfolder2/' 
    blob_path_anomalies = blob_path + '<created_blob_folder_name>/demo.csv'
    blob_service.create_blob_from_text(container_name, blob_path_anomalies, output)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 2022-11-30
      • 2021-03-05
      • 2016-04-16
      • 1970-01-01
      • 2020-08-25
      • 2023-03-03
      • 2018-04-13
      相关资源
      最近更新 更多