仅使用缩略图创建器Azure函数处理图像



我创建了一个简单的Azure函数,该函数为上传到Azure容器的图像创建缩略图,该缩略图由BlobTrigger触发。

它工作得很好,但因为我的容器有图像文件以及其他类型,如PDF, Excel, Word等,该函数被所有这些文件触发。

我想我可以通过确保我们只使用下面的代码处理图像文件来解决这个问题。它可以工作,因为它只处理图像文件,但它似乎仍然为目标容器中的其他文件类型创建占位符blobs。

例如,如果它在源容器中检测到一个名为myfile.pdf的文件,它仍然在目标容器中创建一个myfile.pdf,但它是0字节。

我如何确保一个非图像文件完全被跳过,甚至不创建占位符在我的目标容器?

[FunctionName("ImageResizer")]
public async Task Run([BlobTrigger("my-source-container/{name}", Connection = "myconnection")] Stream input, string name, [Blob("my-thumbnails-container/{name}", FileAccess.Write, Connection = "myconnection")] Stream outputBlob, ILogger log)
{
try
{
var fileExtension = FileUtils.GetFileExtension(name);
if (!string.IsNullOrEmpty(fileExtension))
{
if (fileExtension.ToLower() == "png" || fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
{
using (var image = Image.Load(input))
{
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(150, 150),
Mode = ResizeMode.Crop
}));
using (var ms = new MemoryStream())
{
if(fileExtension.ToLower() == "png")
await image.SaveAsPngAsync(outputBlob);
else if(fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
await image.SaveAsJpegAsync(outputBlob);
}
}
log.LogInformation($"C# Blob trigger function Processed blobn Name:{name} n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}

当使用属性使用声明性绑定时,这是不可避免的,除非您可以使用BlobTrigger属性以某种方式过滤掉不需要的blobs。输出绑定的默认行为是期望绑定是必需的,因此在函数执行后立即创建该绑定。

然而,对于。net语言,你可以使用运行时绑定,所以只有实际处理的blob才会导致输出文件,参见文档。这样,您可以更好地控制何时创建输出blob。

[FunctionName("ImageResizer")]
public async Task Run([BlobTrigger("my-source-container/{name}", Connection = "myconnection")] Stream input, string name, IBinder binder, ILogger log)
{
try
{
var fileExtension = FileUtils.GetFileExtension(name);
if (!string.IsNullOrEmpty(fileExtension))
{
if (fileExtension.ToLower() == "png" || fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
{
using (var image = Image.Load(input))
{
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(150, 150),
Mode = ResizeMode.Crop
}));
var attribute = new BlobAttribute("my-thumbnails-container/{name}", FileAccess.Write); 
attribute.Connection = "myconnectionstring"; 
using (var ms = new MemoryStream()) 
using (var stream = await binder.BindAsync<Stream>(attribute))
{
if (fileExtension.ToLower() == "png")
await image.SaveAsPngAsync(stream);
else if (fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
await image.SaveAsJpegAsync(stream);
}
}
log.LogInformation($"C# Blob trigger function Processed blobn Name:{name} n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}

这里还有一篇博文概述了我刚才所做的。

最新更新