【问题标题】:Is there a way to copy a blob from the local storage emulator to a remote azure storage?有没有办法将 blob 从本地存储模拟器复制到远程 Azure 存储?
【发布时间】:2019-02-20 18:25:03
【问题描述】:

我正在尝试将视频文件从本地 azure 存储复制到 C# 中的远程存储,以便能够使用 Azure 媒体服务对其进行编码。

使用 StartCopy 方法检索副本的 blob 后,我收到 404 NOT FOUNT 异常返回。

destinationBlob.StartCopy(new Uri(sourceBlob.Uri.AbsoluteUri + signature));

sourceBlob.Uri.AbsoluteUri 的值是本地 Uri (http://127.0.0.1/ 参数)

我希望副本被执行,但我得到了 404 错误。

【问题讨论】:

  • “我希望副本被执行” - 我不希望 Azure 存储能够访问我的本地计算机..
  • 执行复制的代码在本地运行,所以是的,我希望复制是可能的
  • 这不是 URL 的工作方式。您正在告诉 Azure 转到 URL 并复制 blob。该 URL 仅在本地可用,因此复制失败。

标签: c# azure azure-storage azure-storage-emulator


【解决方案1】:
  • 您需要两个到 Azure 存储的连接。
  • 您需要在模拟器中连接到本地视频文件,并将其视为流(称为 localStream)。
  • 然后您需要在 Azure 存储中打开目标(远程)端点并打开它 用于以流形式写入(称为 remoteStream)
  • 然后您可以执行 localStream.CopyTo(remoteStream);

此示例允许您将 Task 传递给此函数,该函数接受 Stream 作为要处理的对象。您需要调整 utils.GetBlockBlobReference 以指向您的实际 blob 引用。此方法为 Wtire 打开流,您可能还需要一个打开流以供读取的方法。我有不同的提供者用于读取/写入存储。

    public async Task Use(string pointer, Func<System.IO.Stream, Task> useAction)
    {
        if (useAction == null)
        {
            throw new ArgumentNullException(nameof(useAction));
        }

        var blobRef = await utils.GetBlockBlobReference(storageFactory, pointer);
        using (var cloudStream = await blobRef.OpenWriteAsync())
        {
            await useAction(cloudStream);
        }
    }

【讨论】:

  • 你能给我一些关于如何实现这一目标的建议吗?
  • 在一个代码示例中添加,该示例打开一个 blob 以作为流写入。然后,您可以传入一个接受该流并可以写入它的任务。
【解决方案2】:

很遗憾,您将无法使用Copy Blob 功能完成此操作。 Copy Blob 操作的原因是异步服务器端操作,需要存储服务到达复制源。

由于复制源是本地模拟器中的一个 blob,存储服务无法访问它,因此您会收到 404 错误。

您需要先从本地计算机上的模拟器下载 blob,然后将 blob 上传到云中。

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2012-03-22
    • 2022-09-28
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多