2017-08-25 76 views
1

我在Visual Studio 2017中使用最新的Azure函数SDK,我想将一个blob从一个容器复制到另一个容器。名称保持不变,但容器名称将从源blob的元数据中检索。使用VS2017在Azure函数中复制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); 
    } 

但现在的功能不是事件调用,所以做了绑定的错误。有什么明显的我做错了吗?我发现很难找到使用新功能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); 
    } 

这看起来像它会工作(当我有输出工作)?

谢谢

+0

例2 - 在部署时查看'function.json'来查看它生成的绑定。例3不起作用,你可能需要使用'ICollector'。 – Mikhail

+0

@Mikhail'function.json'只有输入绑定,不显示输出,所以不太确定我做错了什么 – ADringer

回答

1

你的第二个例子在我身边工作得很好。这是我的功能应用程序中生成的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); 
} 
相关问题