如何在Azure Functions中读取POST请求上传的txt文件并转为字符串
问题根源
- 你的当前代码仅适配请求体为JSON格式的调用场景,而你上传txt文件时的POST请求是
multipart/form-data格式,直接读取整个请求体反序列化JSON的逻辑完全不匹配,自然会拿到空值 - 你错误地把整个请求体当成JSON处理,没有单独解析上传的文件流
修复步骤
- 首先判断请求是否包含上传的文件,不要直接读取整个
req.Body做JSON反序列化 - 从表单集合中取出上传的txt文件,单独读取文件流得到文本内容
- 如果你需要传的
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
相关产品推荐
相关产品推荐

