.NET 4.5中如何将byte转换为IFormFile调用.NET Core接口
解决.NET 4.5向.NET Core Web API上传byte数组作为IFormFile的问题
你的核心问题是没有正确构造符合multipart/form-data规范的请求内容,导致.NET Core端无法将上传的byte数组识别为IFormFile。以下是修正后的实现方案:
修正后的代码
using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri(ServiceInfo.VIPCParams["DMSUri"].Value); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", responseModelLogin.Token); // 与API接口的ICollection<IFormFile>参数名保持一致,示例假设参数名为"files" string formFieldName = "files"; // 自定义文件名和对应的媒体类型(根据实际图片类型调整,比如image/png) string fileName = "uploaded-image.jpg"; string mediaType = "image/jpeg"; // 包装byte数组并设置正确的媒体类型 ByteArrayContent fileContent = new ByteArrayContent(uploadRequest.File); fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(mediaType); // 构造多部分表单内容,关键是指定表单字段名和文件名 var multipartContent = new MultipartFormDataContent(); // 参数顺序:内容对象、表单字段名、文件名 multipartContent.Add(fileContent, formFieldName, fileName); // 发送请求(异步场景推荐用await替代.Result,避免死锁) HttpResponseMessage res = client.PostAsync(url, multipartContent).Result; string data = res.Content.ReadAsStringAsync().Result; mSUploadResponse = JsonConvert.DeserializeObject<DMSUploadResponse>(data); }
关键注意事项
- 表单字段名必须匹配:
multipartContent.Add的第二个参数必须和.NET Core API中ICollection<IFormFile>的参数名完全一致。例如API定义为public IActionResult Upload([FromForm]ICollection<IFormFile> files),则这里必须填"files"。 - 指定文件名和媒体类型:必须为上传内容设置文件名(任意合法名称均可)和正确的媒体类型,否则.NET Core无法将其解析为
IFormFile实例。 - 同步调用风险:如果你的代码运行在异步上下文(比如ASP.NET MVC控制器),建议将
.Result替换为await,避免潜在的死锁问题。
内容的提问来源于stack exchange,提问作者Nahid
相关产品推荐
相关产品推荐

