你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 Azure Functions 和 Blob 存储上传和分析文件

在本教程中,你将了解如何将图像上传到 Azure Blob 存储并使用 Azure Functions 和计算机视觉对其进行处理。 你还将了解如何在此过程中实现 Azure Function 触发器和绑定。 这些服务将一起分析包含文本的上传图像,从中提取文本,然后将文本存储在数据库行中,供以后分析或用于其他用途。

Azure Blob 存储是 Microsoft 针对云提供的可大规模缩放的对象存储解决方案。 Blob 存储设计用于存储图像和文档、流式处理媒体文件、管理备份和存档数据等等。 有关 Blob 存储的详细信息,请阅读概述页面

Azure Functions 是一种无服务器计算机解决方案,允许你编写和运行小块代码作为高度可缩放、无服务器、事件驱动的函数。 有关 Azure Functions 的详细信息,请阅读概述页面

在本教程中,您将学习如何执行以下操作:

  • 将图像和文件上传到 Blob 存储
  • 使用 Azure Function 事件触发器处理上传到 Blob 存储的数据
  • 使用认知服务分析图像
  • 使用 Azure Function 输出绑定将数据写入表存储

先决条件

创建存储帐户和容器

第一步是创建存储帐户来保存上传的 blob 数据,在本方案中为包含文本的图像。 存储帐户提供多种不同的服务,但本教程使用 Blob 存储和表存储。

登录到 Azure 门户

  1. 在门户顶部的搜索栏中,搜索“存储”并选择标有“存储帐户”的结果。

  2. 在“存储帐户”页面上,选择左上角的“+ 创建”。

  3. 在“创建存储帐户”页面上,输入以下值:

  • 订阅:选择所需的订阅。
  • 资源组:选择“新建”并输入名称 msdocs-storage-function,然后选择“确定”。
  • 存储帐户名称:输入值 msdocsstoragefunction。 存储帐户名称在 Azure 中必须是唯一的,因此你可能需要在名称后面添加数字,例如 msdocsstoragefunction123
  • 区域:选择离你最近的区域。
  • 性能:选择“标准”。
  • 冗余:保持选中默认值。

显示如何在 Azure 中创建存储帐户的屏幕截图。

  1. 选择底部的“查看 + 创建”,Azure 将验证你输入的信息。 验证设置后,选择“创建”,Azure 将开始预配存储帐户,这可能需要一些时间。

创建容器

  1. 预配存储帐户后,选择“转到资源”。 下一步是在帐户内创建一个存储容器来保存要进行分析的上传图像。

  2. 在导航面板上,选择“容器”。

  3. 在“容器”页面上,选择顶部的“+ 容器”。 在滑出面板中,输入 imageanalysis 作为“名称”,并确保将“公共访问级别”设置为“Blob (仅匿名读取访问 blob)”。 然后选择“创建”。

显示如何新建存储容器的屏幕截图。

你应该会看到新容器出现在容器列表中。

检索连接字符串

最后一步是检索存储帐户的连接字符串。

  1. 在左侧导航面板上,选择“访问密钥”。

  2. 在“访问密钥”页面上,选择“显示密钥”。 复制 key1 部分下的“连接字符串”的值,并将其粘贴到某处供稍后使用。 此外,还需要记下存储帐户名称 msdocsstoragefunction 供稍后使用。

显示如何访问存储容器的屏幕截图。

当我们需要将 Azure Function 连接到此存储帐户时,需要用到这些值。

创建计算机视觉服务

接下来,创建计算机视觉服务帐户来处理上传的文件。 计算机视觉是 Azure 认知服务的一部分,它提供各种用于从图像中提取数据的功能。 有关计算机视觉的详细信息,请阅读概述页面

  1. 在门户顶部的搜索栏中,搜索“计算机”并选择标有“计算机视觉”的结果。

  2. 在“计算机视觉”页面上,选择“+ 创建”。

  3. 在“创建计算机视觉”页面上,输入以下值:

  • 订阅:选择所需的订阅。
  • 资源组:使用之前创建的 msdocs-storage-function 资源组。
  • 区域:选择离你最近的区域。
  • 名称:输入名称 msdocscomputervision
  • 定价层:如果可用,请选择“免费”,否则选择“标准 S1”。
  • 选中“负责任的 AI 声明”框(如果同意这些条款)

显示如何新建计算机视觉服务的屏幕截图。

  1. 选择底部的“查看 + 创建”。 Azure 会花点时间验证输入的信息。 验证设置后,选择“创建”,Azure 将开始预配计算机视觉服务,这可能需要一些时间。

  2. 操作完成后,选择“转到资源”。

检索密钥

接下来,我们需要找到计算机视觉服务的密钥和终结点 URL,以在 Azure Function App 中使用。

  1. 在“计算机视觉”概述页面上,选择“密钥和终结点”。

  2. 在“密钥和终结点”页面上,复制“密钥 1”值和“终结点”值,并将它们粘贴到某处供稍后使用。

显示如何检索计算机视觉服务的密钥和 URL 终结点的屏幕截图。

下载并配置示例项目

本教程中使用的 Azure Function 的代码可在此 GitHub 存储库中找到。 也可以使用以下命令克隆项目。

git clone https://github.com/Azure-Samples/msdocs-storage-bind-function-service.git \
cd msdocs-storage-bind-function-service/dotnet

示例项目代码将完成以下任务:

  • 检索环境变量以连接到存储帐户和计算机视觉服务
  • 接受上传的文件作为 blob 参数
  • 使用计算机视觉服务分析 blob
  • 使用输出绑定将分析后的图像文本发送到新表行

下载并打开项目后,需要了解下面显示的主要 Run 方法中的一些基本概念。 Azure Function 使用触发器和输出绑定,这些绑定通过 Run 方法签名上的属性来应用。

Table 属性使用两个参数。 第一个参数指定要写入函数返回的已分析图像文本值的表的名称。 第二个 Connection 参数从环境变量中请求表存储连接字符串,以便 Azure Function 可以访问它。

BlobTrigger 属性用于将 Azure Function 绑定到 Blob 存储中的上传事件,并将上传的 blob 提供给 Run 函数。 blob 触发器本身有两个参数 - 一个是要监视上传的 blob 容器的名称,另一个是存储帐户的连接字符串。

// Azure Function name and output Binding to Table Storage
[FunctionName("ProcessImageUpload")]
[return: Table("ImageText", Connection = "StorageConnection")]
// Trigger binding runs when an image is uploaded to the blob container below
public async Task<ImageContent> Run([BlobTrigger("imageanalysis/{name}", 
        Connection = "StorageConnection")]Stream myBlob, string name, ILogger log)
{
    // Get connection configurations
    string subscriptionKey = Environment.GetEnvironmentVariable("ComputerVisionKey");
    string endpoint = Environment.GetEnvironmentVariable("ComputerVisionEndpoint");
    string imgUrl = $"https://{ Environment.GetEnvironmentVariable("StorageAccountName")}
                        .blob.core.windows.net/imageanalysis/{name}";

    ComputerVisionClient client = new ComputerVisionClient(
        new ApiKeyServiceClientCredentials(subscriptionKey)) { Endpoint = endpoint };

    // Get the analyzed image contents
    var textContext = await AnalyzeImageContent(client, imgUrl);

    return new ImageContent { 
        PartitionKey = "Images",
        RowKey = Guid.NewGuid().ToString(), Text = textContext 
    };
}

public class ImageContent
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Text { get; set; }
}

此代码还从环境变量中检索基本配置值,例如存储帐户连接字符串和计算机视觉密钥。 我们将在部署 Azure Function 环境后,将这些环境变量添加到其中。

ProcessImage 函数还使用称为 AnalyzeImage 的第二种方法,如下所示。 此代码使用计算机视觉帐户的 URL 终结点和密钥向该服务器发出处理图像的请求。 请求将返回在图像中发现的所有文本,然后使用 Run 方法上的输出绑定将其写入表存储。

static async Task<string> ReadFileUrl(ComputerVisionClient client, string urlFile)
{
    // Analyze the file using Computer Vision Client
    var textHeaders = await client.ReadAsync(urlFile);
    string operationLocation = textHeaders.OperationLocation;
    Thread.Sleep(2000);
    
    // Complete code omitted for brevity, view in sample project
    
    return text.ToString();
}

在本地运行

如果你想在本地运行项目,可以使用 local.settings.json 文件填充环境变量。 在此文件中,使用之前在创建 Azure 资源时保存的值填充占位符值。

尽管 Azure Function 代码将在本地运行,但它仍将连接到 Azure 上的实时服务,而不是使用任何本地模拟器。

{
    "IsEncrypted": false,
    "Values": {
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
      "FUNCTIONS_WORKER_RUNTIME": "dotnet",
      "StorageConnection": "your-storage-account-connection-string",
      "StorageAccountName": "your-storage-account-name",
      "ComputerVisionKey": "your-computer-vision-key",
      "ComputerVisionEndPoint":  "your-computer-vision-endpoint"
    }
}

将代码部署到 Azure Functions

现在可以使用 Visual Studio 将应用程序部署到 Azure。 在部署过程中,还可以同时在 Azure 中创建 Azure Functions 应用。

  1. 首先,右键单击 ProcessImage 项目节点并选择“发布”。

  2. 在“发布”对话框屏幕上,选择 Azure 并选择“下一步”。

显示如何选择 Azure 作为部署目标的屏幕截图。

  1. 在下一个屏幕上选择“Azure Function App (Windows)”或“Azure Function App (Linux)”,然后再次选择“下一步”。

显示如何选择 Azure Functions 作为特定部署目标的屏幕截图。

  1. 在“Functions 实例”步骤中,确保选择要部署到的订阅。 接下来,选择对话框右侧的绿色 + 符号。

  2. 将打开一个新对话框。 为新的 Function App 输入以下值。

  • 名称:输入 msdocsprocessimage 或类似名称。
  • 订阅名称:选择你想使用的任何订阅。
  • 资源组:使用之前创建的 msdocs-storage-function 资源组。
  • 计划类型:选择“消耗”。
  • 位置:选择离你最近的区域。
  • Azure 存储:选择之前创建的存储帐户。

显示如何在 Azure 中新建函数应用的屏幕截图。

  1. 填写完所有这些值后,选择“创建”。 Visual Studio 和 Azure 将开始预配请求的资源,这需要一些时间才能完成。

  2. 该过程完成后,选择“完成”以关闭对话框工作流。

  3. 部署 Azure Function 的最后一步是选择屏幕右上角的“发布”。 发布函数可能也需要一些时间才能完成。 完成后,应用程序将在 Azure 上运行。

连接服务

Azure Function 已成功部署,但它还无法连接到存储帐户和计算机视觉服务。 必须先将正确的密钥和连接字符串添加到 Azure Functions 应用的配置设置。

  1. 在 Azure 门户顶部,搜索“function”并从结果中选择“Function App”。

  2. 在“Function App”屏幕上,选择在 Visual Studio 中创建的 Function App。

  3. 在“Function App”概述页面上,选择左侧导航栏中的“配置”。 这将打开一个页面,我们可以在其中管理应用的各种类型的配置设置。 目前,我们对“应用程序设置”部分感兴趣。

  4. 下一步是为存储帐户名称和连接字符串、计算机视觉密钥和计算机视觉终结点添加设置。

  5. 在“应用程序设置”选项卡上,选择“+ 新建应用程序设置”。 在出现的浮出控件中,输入以下值:

  • 名称:输入值 ComputerVisionKey。
  • :粘贴之前保存的计算机视觉密钥。
  1. 单击“确定”将此设置添加到应用。

显示如何将新应用程序设置添加到 Azure 函数的屏幕截图。

  1. 接下来,让我们使用以下值对计算机视觉服务的终结点重复此过程:
  • 名称:输入值 ComputerVisionEndpoint。
  • :粘贴之前保存的终结点 URL。
  1. 使用以下值对存储帐户连接再次重复此步骤:
  • 名称:输入值 StorageConnection。
  • :粘贴之前保存的连接字符串。
  1. 最后,使用以下值对存储帐户名称再次重复此过程:
  • 名称:输入值 StorageAccountName。
  • :输入创建的存储帐户的名称。
  1. 添加这些应用程序设置后,请确保选择配置页面顶部的“保存”。 保存完成后,还可以点击“刷新”,确保已获得设置。

将 Azure Function 连接到不同服务所需的所有环境变量现已到位。

将图像上传到 Blob 存储

现在可以测试应用程序了! 你可以将 blob 上传到容器,然后验证图像中的文本是否已保存到表存储。

  1. 首先,在 Azure 门户顶部,搜索“存储”并选择“存储帐户”。 在“存储帐户”页面上,选择之前创建的帐户。

  2. 接下来,选择左侧导航栏中的“容器”,然后导航到之前创建的 ImageAnalysis 容器。 在此处,可以直接在浏览器中上传测试图像。

显示如何导航到存储容器的屏幕截图。

  1. 你可以在可下载示例项目的根目录的 images 文件夹中找到一些示例图像,也可以使用自己的图像。

  2. 在 ImageAnalysis 页面顶部,选择“上传”。 在打开的浮出控件中,选择右侧的文件夹图标以打开文件浏览器。 选择要上传的图片,然后选择“上传”。

显示如何将 Blob 上传到存储容器的屏幕截图。

  1. 该文件应出现在 blob 容器中。 接下来,可以验证上传是否触发了 Azure Function,以及图像中的文本是否已正确分析并保存到表存储中。

  2. 使用页面顶部的痕迹导航,在存储帐户中向上导航一级。 在左侧导航栏中找到并选择“存储浏览器”,然后选择“表”。

  3. ImageText 表现在应该可用。 单击该表可预览其中的数据行。 你应该会看到上传的已处理图像文本的相应条目。 可以使用时间戳或通过查看“文本”列的内容来验证这一点。

显示 Azure 表存储中的文本条目的屏幕截图。

恭喜! 你已成功使用 Azure Functions 和计算机视觉处理上传到 Blob 存储的图像。

清理资源

如果不打算继续使用此应用程序,可以通过删除资源组来删除创建的资源。

  1. 从主导航栏中选择“资源组”
  2. 从列表中选择 msdocs-storage-function 资源组。
  3. 选择资源组概述页面顶部的“删除资源组”按钮。
  4. 在确认对话框中输入资源组名称 msdocs-storage-function。
  5. 选择“删除”。 删除资源组的过程可能需要几分钟才能完成。