我在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的名称?
答案 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
输出绑定,则Container
和Name
属性将是只读的,由[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.