2017-08-25 18 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); 
} 
相關問題