使用blob内容中的名称将blob反序列化并输出到不同的容器

时间:2018-03-23 20:33:37

标签: c# azure visual-studio-2017 azure-functions azure-blob-storage

我在azure blob中有一个json,我需要反序列化并从中获取字符串。字符串是blob的名称。然后我需要将作为此函数输入的blob复制到我刚提取到存储容器的名称。

public static void Run([BlobTrigger("output/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, TraceWriter log)
using (var sr = new StreamReader(myBlob))
using (var jsonTextReader = new JsonTextReader(sr))
{
    var transcript = (someobject)serializer.Deserialize(jsonTextReader, typeof(Transcript));
    string blobname = (someobject.Results[0].FileName).Substring(0, name.LastIndexOf('.'));

上面是我当前函数的定义以及我用来从json中提取文件名的方法。这可能与blob输入和输出绑定有关吗?如果是这样,有没有办法动态分配输出blob的名称?

2 个答案:

答案 0 :(得分:1)

您可以使用命令式绑定来编写输出blob,其中包含以下内容:

public static void Run(
    [BlobTrigger("input/{name}", Connection = "AzureWebJobsStorage")] string myBlob, 
    string name, 
    Binder binder)
{
  var someobject= serializer.Deserialize<Transcript>(myBlob);
  string blobname = (someobject.Results[0].FileName).Substring(0, name.LastIndexOf('.'));

  using (var writer = binder.Bind<TextWriter>(
              new BlobAttribute($"output/{blobname}")))
  {
      writer.Write(myBlob);
  }
}

我稍微改变了你的功能,使我的例子更容易阅读。

答案 1 :(得分:0)

如果配置CloudBlockBlob输出绑定,则ContainerName属性将是只读的,由[Blob]绑定属性定义。但是,有一种称为“命令式绑定”的东西,它允许您将绑定推迟到运行时,example甚至演示写入任意blob容器和文件名:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
    {
        writer.Write("Hello World!!");
    }
}

对于预编译的应用程序,我个人觉得“老式的方式”更容易阅读,但我认为这是一个偏好的问题。

CloudStorageAccount storage = CloudStorageAccount.Parse(conn_str);
CloudBlobClient blobClient = storage.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(container);
CloudBlockBlob blob =blobContainer.GetBlockBlobReference(filename);
// etc.