You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Http触发Azure函数中用Blob的SAS URI构造表单数据Post请求

解决Azure函数调用Form Recognizer 4.0文件上传API的问题

你遇到的核心问题是:当前代码用JSON格式传递SAS URI,但目标API要求通过表单数据(multipart/form-data)上传文件内容。以下提供两种可行解决方案:

方案一:下载Blob内容并构造表单上传

这种方式完全模拟Postman上传本地文件的逻辑,先通过SAS URI拉取Blob文件流,再将其作为表单文件发送给API:

using (var httpClient = new HttpClient())
{
    // 1. 从SAS URI获取文件流
    var fileStream = await httpClient.GetStreamAsync(formUrl);

    // 2. 构造multipart/form-data表单内容
    using (var formContent = new MultipartFormDataContent())
    {
        // 创建文件内容对象,设置正确的媒体类型
        var fileContent = new StreamContent(fileStream);
        fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
        
        // 将文件添加到表单,参数名需匹配API要求(Form Recognizer默认用"file")
        formContent.Add(fileContent, "file", "target-document.pdf"); // 文件名可自定义

        // 添加API密钥请求头
        httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);

        // 3. 发送POST请求
        var response = await httpClient.PostAsync(uri, formContent);

        if (!response.IsSuccessStatusCode)
        {
            var errorDetail = await response.Content.ReadAsStringAsync();
            throw new HttpRequestException($"请求失败:状态码{response.StatusCode},错误信息:{errorDetail}");
        }

        return response.Headers.GetValues("Operation-Location").FirstOrDefault();
    }
}

关键注意点:

  • 表单参数名(示例中的"file")必须和Form Recognizer API要求一致,不可随意修改。
  • 如果Blob是图片等非PDF文件,需要同步修改ContentType为对应类型(如image/png)。

方案二:使用支持直接传入SAS URI的API端点

Form Recognizer 4.0部分异步分析API支持直接传入文件的SAS URI(JSON格式),无需下载文件内容,效率更高。如果你的业务场景允许,可切换到这类端点:

using (var httpClient = new HttpClient())
{
    // 构造请求体,直接传入SAS URI
    var requestBody = new
    {
        urlSource = formUrl
    };

    var jsonContent = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

    // 添加API密钥请求头
    httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);

    // 发送POST请求
    var response = await httpClient.PostAsync(uri, jsonContent);

    if (!response.IsSuccessStatusCode)
    {
        var errorDetail = await response.Content.ReadAsStringAsync();
        throw new HttpRequestException($"请求失败:状态码{response.StatusCode},错误信息:{errorDetail}");
    }

    return response.Headers.GetValues("Operation-Location").FirstOrDefault();
}

关键注意点:

  • 该方案仅适用于支持urlSource参数的API端点,比如通用文档分析的异步端点:https://{region}.cognitiveservices.azure.com/formrecognizer/documentModels/{modelId}:analyze?api-version=2023-07-31。
  • 需确保使用的API密钥和区域端点对应正确。

内容的提问来源于stack exchange,提问作者Nadeem Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:10:28