2017-08-25 7 views
1

Visual Studio 2017で最新のAzure Function 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); 
    } 

しかし、今の機能呼び出されるイベントではないので、バインディングに何か問題があります。私が間違っていることが明らかに何かありますか?私は、新しい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); 
    } 

出力がうまくいくように見えますか?

ありがとうございました

+0

例2 - 生成されたバインディングを確認するために展開されたときに 'function.json'を見てください。例3は動作しません。おそらく 'ICollector'を使う必要があります。 – Mikhail

+0

@Mikhail 'function.json'は入力バインディングしか持たず、出力を表示しません。 – ADringer

答えて

1

2番目の例は私の側でうまくいきました。私の関数appで生成された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 Storage 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); 
} 
関連する問題