如何在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
相关产品推荐
相关产品推荐

