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

如何在Azure Functions中读取POST请求上传的txt文件并转为字符串

问题根源

  • 你的当前代码仅适配请求体为JSON格式的调用场景,而你上传txt文件时的POST请求是multipart/form-data格式,直接读取整个请求体反序列化JSON的逻辑完全不匹配,自然会拿到空值
  • 你错误地把整个请求体当成JSON处理,没有单独解析上传的文件流

修复步骤

  1. 首先判断请求是否包含上传的文件,不要直接读取整个req.Body做JSON反序列化
  2. 从表单集合中取出上传的txt文件,单独读取文件流得到文本内容
  3. 如果你需要传的fname、lname参数是和文件一起提交的表单参数,也需要从req.Form中取值,不要只从URL查询参数取

修正后的核心代码示例

[FunctionName("Function1")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    Person p = new Person();
    string text = string.Empty;

    // 优先从表单取参数,再兼容查询参数
    string fname = req.Form["fname"].FirstOrDefault() ?? req.Query["fname"].FirstOrDefault();
    string lname = req.Form["lname"].FirstOrDefault() ?? req.Query["lname"].FirstOrDefault();

    // 处理上传的txt文件
    if (req.ContentType != null && req.ContentType.Contains("multipart/form-data") && req.Form.Files.Any())
    {
        // 取第一个上传的文件
        var uploadedFile = req.Form.Files[0];
        if (uploadedFile.Length > 0 && uploadedFile.FileName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
        {
            using (var reader = new StreamReader(uploadedFile.OpenReadStream(), Encoding.UTF8))
            {
                text = await reader.ReadToEndAsync();
            }
            log.LogInformation("读取到的txt文件内容:" + text);
        }
    }
    // 保留纯JSON请求场景的兼容逻辑
    else if (req.ContentType != null && req.ContentType.Contains("application/json"))
    {
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        log.LogInformation("JSON请求体内容:" + requestBody);
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        text = Convert.ToString(data);
        fname = fname ?? data?.fname;
        lname = lname ?? data?.lname;
    }

    if (!string.IsNullOrEmpty(fname))
    {
        p.firstName = fname;
        p.lasttName = lname;
        p.text = text;

        Guid g = Guid.NewGuid();
        string filename = g + ".txt";
        await CreateBlob(filename, p, log, filename);
    }

    string responseMessage = string.IsNullOrEmpty(fname)
        ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
        : $"Hello, {fname} {lname}.";

    return new OkObjectResult(responseMessage);
}

测试注意事项

  • 上传文件时请求头的Content-Type要设置为multipart/form-data
  • 如果不需要兼容纯JSON调用场景,可以删掉对应的分支逻辑减少冗余代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:15:05