【问题标题】:Copying Blob in Azure Function with VS2017使用 VS2017 在 Azure Function 中复制 Blob
【发布时间】:2018-02-03 14:48:14
【问题描述】:

我在 Visual Studio 2017 中使用最新的 Azure Function SDK,我想将一个 Blob 从一个容器复制到另一个容器。名称保持不变,但将从源 blob 的元数据中检索容器名称。

我一开始只是尝试触发函数并将元数据包含为:

    [FunctionName("ScanFile")]
    public static void Run([BlobTrigger("tobescanned/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, IDictionary<string, string> metadata, string name, TraceWriter log)
    {
        log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        log.Info($"metadata count {metadata.Count}");
    } 

这行得通,因此尝试将副本复制为:

    [FunctionName("ScanFile")]
    public static void Run([BlobTrigger("tobescanned/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, IDictionary<string, string> metadata, string name,
        [Blob("employees/{name}", Connection = "AzureWebJobsStorage")]Stream outputBlob,
        TraceWriter log)
    {
        log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        log.Info($"metadata count {metadata.Count}");

        myBlob.CopyTo(outputBlob);
    }

但是现在函数不是事件调用,所以绑定有问题。有什么明显的我做错了吗?我发现使用新的 Function SDK 很难找到示例。

下一步(当我让它工作时)是在运行时设置输出容器。我想可能是这样的:

    [FunctionName("ScanFile")]
    public static void Run([BlobTrigger("tobescanned/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, IDictionary<string, string> metadata, string name,
        [Blob("{outputContainer}/{name}", Connection = "AzureWebJobsStorage")]Stream outputBlob, string outputContainer,
        TraceWriter log)
    {
        log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        log.Info($"metadata count {metadata.Count}");

        outputContainer = metadata["Destination"];

        myBlob.CopyTo(outputBlob);
    }

这看起来会起作用吗(当我的输出正常工作时)?

谢谢

【问题讨论】:

  • Ex 2 - 在部署 function.json 时查看它生成的绑定。 Ex 3 不起作用,您可能需要使用 ICollector
  • @Mikhail function.json 只有输入绑定,不显示输出所以不太确定我做错了什么

标签: c# azure azure-functions


【解决方案1】:

您的第二个示例对我来说效果很好。这是在我的函数应用中生成的函数 JSON。 Blob 绑定的方向是“向外”。

{
  "bindings": [
    {
      "type": "blobTrigger",
      "path": "tobescanned/{name}",
      "direction": "in",
      "name": "myBlob"
    },
    {
      "type": "blob",
      "path": "employees/{name}",
      "direction": "out",
      "name": "outputBlob"
    }
  ],
  "disabled": false
}

您的第三个示例无法运行,因为在触发函数时必须给出输入参数 {outputContainer}。根据您的要求,我建议您使用 Azure 存储 Blob SDK 来完成复制操作。以下代码供您参考。

[FunctionName("ScanFile")]
public static void Run([BlobTrigger("tobescanned/{name}")]CloudBlockBlob myBlob, string name,
    IDictionary<string, string> metadata)
{
    var destinationContainer = myBlob.Container.ServiceClient.GetContainerReference(metadata["Destination"]);
    destinationContainer.CreateIfNotExists();
    CloudBlockBlob outputBlob = destinationContainer.GetBlockBlobReference(name);
    outputBlob.StartCopy(myBlob);
}

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2016-02-13
    • 2019-11-06
    • 2016-09-21
    • 1970-01-01
    • 2021-03-13
    • 2014-04-13
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多