使用缩略图创建器 Azure Functions 仅处理图像
Handling only images with thumbnail creator Azure Function
我创建了一个简单的 Azure 函数,它为上传到 Azure 容器的图像创建缩略图,该容器由 BlobTrigger
触发。
它工作正常,但因为我的容器既有图像文件,也有其他类型的文件,例如PDF、Excel、Word 等,所有这些文件都会触发该功能。
我想我可以通过确保我们只使用下面的代码处理图像文件来解决这个问题。它有点工作,因为它只处理图像文件,但它似乎仍然为目标容器中的其他文件类型创建占位符 blob。
例如,如果它在源容器中检测到名为 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 blob\n Name:{name} \n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}
当使用属性使用声明性绑定时,这是不可避免的,除非您可以使用 BlobTrigger
属性以某种方式过滤掉不需要的 blob。输出绑定的默认行为是期望绑定是必需的,因此它会在函数执行后立即创建。
但是,对于 .Net 语言,您可以使用运行时绑定,因此只有实际处理的 blob 才会生成输出文件,请参阅 the docs。这样您就可以更好地控制何时创建输出 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 blob\n Name:{name} \n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}
Here 也是一篇博文,概述了我刚刚所做的事情。
我创建了一个简单的 Azure 函数,它为上传到 Azure 容器的图像创建缩略图,该容器由 BlobTrigger
触发。
它工作正常,但因为我的容器既有图像文件,也有其他类型的文件,例如PDF、Excel、Word 等,所有这些文件都会触发该功能。
我想我可以通过确保我们只使用下面的代码处理图像文件来解决这个问题。它有点工作,因为它只处理图像文件,但它似乎仍然为目标容器中的其他文件类型创建占位符 blob。
例如,如果它在源容器中检测到名为 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 blob\n Name:{name} \n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}
当使用属性使用声明性绑定时,这是不可避免的,除非您可以使用 BlobTrigger
属性以某种方式过滤掉不需要的 blob。输出绑定的默认行为是期望绑定是必需的,因此它会在函数执行后立即创建。
但是,对于 .Net 语言,您可以使用运行时绑定,因此只有实际处理的 blob 才会生成输出文件,请参阅 the docs。这样您就可以更好地控制何时创建输出 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 blob\n Name:{name} \n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}
Here 也是一篇博文,概述了我刚刚所做的事情。