WebForm后台调用WebApi发送含IFormCollection对象时文件未发送的解决方案
解决WebForm后台调用WebApi传输文件的问题
你当前使用的application/x-www-form-urlencoded编码格式仅支持文本数据传输,无法处理文件这类二进制内容,因此需要改用multipart/form-data格式(HTTP协议专门用于混合上传文本与文件的标准格式)。以下是改造后的完整代码:
string url = URLService + method; WebRequest wrqst = WebRequest.Create(url); wrqst.Method = "POST"; // 生成随机边界符,用于分隔表单中的不同部分 string boundary = "----WebKitFormBoundary" + Guid.NewGuid().ToString("N"); wrqst.ContentType = $"multipart/form-data; boundary={boundary}"; using (var requestStream = wrqst.GetRequestStream()) using (var writer = new StreamWriter(requestStream, Encoding.UTF8)) { // 写入普通表单字段 foreach (string key in form.Keys) { // 写入字段边界 writer.WriteLine($"--{boundary}"); // 写入字段内容描述 writer.WriteLine($"Content-Disposition: form-data; name=\"{key}\""); writer.WriteLine(); // 写入字段值 writer.WriteLine(HttpUtility.UrlEncode(form[key])); } // 从WebForm的Request.Files中获取要上传的文件,这里处理所有上传文件 HttpFileCollection files = HttpContext.Current.Request.Files; foreach (string fileKey in files) { HttpPostedFile file = files[fileKey]; if (file.ContentLength > 0) { // 写入文件部分的边界 writer.WriteLine($"--{boundary}"); // 写入文件内容描述,包含文件名 writer.WriteLine($"Content-Disposition: form-data; name=\"{fileKey}\"; filename=\"{HttpUtility.UrlEncode(file.FileName)}\""); // 写入文件的MIME类型 writer.WriteLine($"Content-Type: {file.ContentType}"); writer.WriteLine(); // 确保StreamWriter的缓冲区写入到请求流,避免文本与二进制内容混合 writer.Flush(); // 将文件二进制内容写入请求流 file.InputStream.CopyTo(requestStream); // 写入换行分隔不同部分 writer.WriteLine(); } } // 写入结束边界,标记表单内容结束 writer.WriteLine($"--{boundary}--"); writer.Flush(); } // 获取并处理响应 using (WebResponse oResponse = wrqst.GetResponse()) using (var responseStream = oResponse.GetResponseStream()) using (var reader = new StreamReader(responseStream)) { string responseContent = reader.ReadToEnd(); // 这里添加你的响应处理逻辑 }
关键说明:
- 边界符(boundary):必须是请求内容中唯一的字符串,用来区分不同的表单部分,避免内容混淆。
- 内容格式:每个表单字段/文件都需要用边界符包裹,同时指定
Content-Disposition描述字段名称或文件信息;文件部分额外需要指定Content-Type标识文件类型。 - 流操作顺序:写入文件二进制内容前要先刷新
StreamWriter缓冲区,防止文本内容和二进制内容混合导致文件损坏。
接收端通过Request.Files即可正常获取到上传的文件,无需额外修改(只要WebApi接收逻辑原本支持multipart/form-data格式)。
内容的提问来源于stack exchange,提问作者JAMURILLO
相关产品推荐
相关产品推荐

