繁体   English   中英

使用VS2017在Azure功能中复制Blob

[英]Copying Blob in Azure Function with VS2017

我在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);
    }

这看起来是否有效(当我输出工作时)?

谢谢

你的第二个例子在我身边很好。 这是我的功能应用程序中生成的函数JSON。 blob绑定的方向是“out”。

{
  "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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM