azure - Azure BlobTrigger 为每个新 blob 触发 > 5 次
问题描述
以下触发器在将 blob(图像)上传到 azure 存储后从它们中删除 exif 数据。问题是每个 blob 的 blob 触发器至少触发 5 次。
在触发器中,通过向其写入新的数据流来更新 blob。我曾假设Blob 收据会阻止针对该 Blob 进一步触发 Blob 触发器。
[FunctionName("ExifDataPurge")]
public async System.Threading.Tasks.Task RunAsync(
[BlobTrigger("container/{name}.{extension}", Connection = "")]CloudBlockBlob image,
string name,
string extension,
string blobTrigger,
ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}");
try
{
var memoryStream = new MemoryStream();
await image.DownloadToStreamAsync(memoryStream);
memoryStream.Position = 0;
using (Image largeImage = Image.Load(memoryStream))
{
if (largeImage.Metadata.ExifProfile != null)
{
//strip the exif data from the image.
for (int i = 0; i < largeImage.Metadata.ExifProfile.Values.Count; i++)
{
largeImage.Metadata.ExifProfile.RemoveValue(largeImage.Metadata.ExifProfile.Values[i].Tag);
}
var exifStrippedImage = new MemoryStream();
largeImage.Save(exifStrippedImage, new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder());
exifStrippedImage.Position = 0;
await image.UploadFromStreamAsync(exifStrippedImage);
}
}
}
catch (UnknownImageFormatException unknownImageFormatException)
{
log.LogInformation($"Blob is not a valid Image : {name}.{extension}");
}
}
解决方案
触发器的处理方式是通过将收据存储在容器中来跟踪哪些 blob 已被处理azure-webjobs-hosts
。任何没有收据的 blob 或旧收据(基于 blob ETag)都将被处理(或重新处理)。
因为你调用 await image.UploadFromStreamAsync(exifStrippedImage);
它被触发(假设它没有被处理)
推荐阅读
- java - C# AES 加密到 java 8 解密
- javascript - 如何存储来自另一个组件数据的值?
- google-apps-script - 在 Google App 脚本中更改条件格式优先级
- c# - 如果元素匹配,我如何获得 dynamic[] 的值?
- android - Android Studio 4.X 删除了导出到 zip 文件?
- r - 向 ggpairs() 散点图添加文本?
- android-studio - Android Studio 4.1 构建失败
- python - 使用 __init__.py 导入兄弟包不起作用
- python - 等待在 AWS Boto3 中为 Elasticbeanstalk 完成应用程序版本创建,然后再创建环境
- laravel - 如何将子域指向子文件夹