是否可以使用定期触发的函数(计时器触发器)循环访问 Azure 存储容器中的所有 Blob 并对其进行操作。
路径: {容器名称}/{目录名称}/{文件名}
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace SampleNamespace
{
public static class SampleFunction
{
[FunctionName("SampleFunction")]
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
{
// How to iterate an operate on all blobs?
}
}
}
除了使用存储blob sdk(Ivan provide)之外,您可以使用blob绑定来获取容器客户端,然后执行列表操作。
您可以参考 blob 输入用法,可以找到它支持绑定 CloudBlobContainer
或 CloudBlobDirectory
类型。您可以参考下面的代码。
[FunctionName("Function1")]
public static async System.Threading.Tasks.Task RunAsync([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log,
[Blob("test",Connection = "AzureWebJobsStorage")]CloudBlobContainer container)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
var segment = await container.ListBlobsSegmentedAsync(null);
var blobs = segment.Results;
foreach (var blob in blobs) {
log.LogInformation(blob.GetType().ToString(), blob.ToString());
}
}
如果将返回所有 blob 和 blob 目录,下面是我的测试结果,所以你需要判断返回类型是 CloudBlockBlob
还是 CloudBlobDirectory
然后执行列表操作。
您应该为azure函数安装此blob存储nuget包Microsoft.Azure.Storage.Blob。然后您可以使用ListBlos
等sync方法
代替async方法
ListBlosSegmentedAsync
。最后,您可以编写代码来操作这些blob。
代码如下:
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System;
namespace FunctionApp7
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
log.LogInformation("the blobs list:");
var connectionString = "DefaultEndpointsProtocol=https;AccountName=xx;AccountKey=xxxx;EndpointSuffix=core.windows.net";
var containerName = "test4";
var directoryName = "sub1";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
//list blobs in a container
var blobs = container.ListBlobs(useFlatBlobListing: true);
foreach (IListBlobItem item in blobs)
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
//other operation.
}
}
//list blobs in a directory
CloudBlobDirectory directory = container.GetDirectoryReference(directoryName);
var blobs_2 = directory.ListBlobs(useFlatBlobListing: true);
foreach(IListBlobItem item in blobs_2)
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
//other operation.
}
}
}
}
}
我有一个现有的 Azure 函数,用于解压缩文件并将每个文件添加为 blob。 我现在想迭代这些文件并执行它们(它们是SQL文件)。我不想触发一个基于blob创建的函数,而是在一个函数中运行它们。 在一个函数中,我如何在一个容器中迭代一个blobs列表并获取它们的内容? 谢谢
Azure函数存储帐户Blob容器触发器 在我们的一个用例中,我正在为具有以下条件的存储帐户容器中的任何活动寻找Azure函数触发器 < li >具有特定命名约定的容器(名称如xxxx-input) < li >它应该自动检测是否创建了新的容器(具有特定的命名约定) < li>
我正在使用Python 3.x编写一个Azure timer触发器。我已经运行了一个这样的函数。我想我知道怎么做,从JS创建一个然后删除' index.js '并创建一个run.py,但这次,当我运行我的python函数时,我总是得到一个错误,说“没有这样的文件:index.js”。我没有看到函数和“index.js”文件之间有任何联系。 有什么想法吗?
如果你使用blob存储触发器阅读Azure WebJobs上的留档,它们会提到这不是很可靠: WebJobs SDK扫描日志文件以查看新的或更改的blob。这个过程不是实时的;在创建blob后的几分钟或更长时间内,函数可能不会被触发。此外,存储日志是在“尽力而为”的基础上创建的;无法保证所有事件都将被捕获。在某些情况下,日志可能会丢失。如果您的应用程序无法接受blob触发器的速度和可靠性限制,建议
我在使用 blob 触发器的消费计划上创建了一个 Azure 函数。然后,我向 Blob 添加大量文件,并且我希望每次将文件添加到触发器时都会调用 Azure 函数。 因为我使用Azure函数和消耗计划,所以我希望不存在可伸缩性问题,对吗?错。 我可以轻松地将文件添加到blob中,速度比Azure函数处理它们的速度快。一百个用户可以添加到blob中,但在任何时候似乎只有一个Azure函数的实例在工
我对azure非常陌生,正在努力处理eventGrid中的python函数触发器。我正在使用从azure为python创建的现成模板,并出现错误。我将共享这些文件。 (init.py) function.json 主机. json 这是我发送给事件网格的数据集 我得到的错误是 也许在上面的某个地方很容易出错,但我找不到。。 提前感谢!