如何使用System.Net.Http库的PostAsync方法向Web服务发送图片
如何在WinUI中通过HttpClient同时发送学生数据和图片
我来帮你搞定这个问题——要同时发送学生数据和图片,咱们不能直接用StringContent了,得用MultipartFormDataContent来构建多部分表单请求,这样既能传JSON格式的学生信息,又能传图片文件。下面是修改后的完整代码和关键说明:
第一步:添加图片转字节数组的辅助方法
首先需要把你已经获取到的IRandomAccessStream(也就是stream变量)转换成字节数组,这样才能添加到请求内容里:
private async Task<byte[]> ConvertStreamToByteArray(IRandomAccessStream stream) { byte[] bytes = new byte[stream.Size]; using (var reader = new DataReader(stream.GetInputStreamAt(0))) { await reader.LoadAsync((uint)stream.Size); reader.ReadBytes(bytes); } return bytes; }
第二步:修改btnSuivant_Click方法
我已经修正了你原代码里的语法错误(比如属性赋值时缺少的逗号),同时重构了请求逻辑,用多部分表单同时发送学生数据和图片:
private async void btnSuivant_Click(object sender, RoutedEventArgs e) { try { // 1. 创建并填充学生对象(修正了原代码的语法错误) var etudiant = new Etudiant() { nom_etudiant = txtNom.Text, prenom_etudiant = txtPrenom.Text, matricule = txtMatricule.Text, mots_passe = txtMotsPasse.Text // 这里不用给picture属性赋值,我们单独传图片文件 }; // 2. 将学生对象序列化为JSON字符串 var etudiantJson = JsonConvert.SerializeObject(etudiant); var studentJsonContent = new StringContent(etudiantJson); studentJsonContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); // 3. 把图片流转换成字节数组(确保stream已经正确获取了图片) byte[] imageBytes = null; if (stream != null) { imageBytes = await ConvertStreamToByteArray(stream); } // 4. 构建多部分表单内容 var multipartContent = new MultipartFormDataContent(); // 添加学生JSON数据,后端需要通过"etudiant"这个名称接收 multipartContent.Add(studentJsonContent, "etudiant"); // 添加图片文件(如果有图片的话) if (imageBytes != null) { var imageContent = new ByteArrayContent(imageBytes); // 根据你的图片类型调整ContentType,比如JPG用"image/jpeg" imageContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png"); // "picture"是后端接收文件的参数名,文件名可以自定义 multipartContent.Add(imageContent, "picture", "student_profile.png"); } // 5. 发送POST请求 using (var client = new HttpClient()) { var response = await client.PostAsync("http://localhost:50638/api/Etudiants", multipartContent); // 确保请求成功,失败会抛出异常 response.EnsureSuccessStatusCode(); // 可选:显示成功提示 await new ContentDialog() { Title = "操作成功", Content = "学生数据和图片已成功发送到服务器", CloseButtonText = "确定" }.ShowAsync(); } } catch (Exception ex) { // 异常处理,显示错误信息 await new ContentDialog() { Title = "发送失败", Content = $"出错了:{ex.Message}", CloseButtonText = "确定" }.ShowAsync(); } }
关键注意事项
- 后端适配:你的Web服务接口需要支持接收
multipart/form-data类型的请求,并且要能分别接收名为etudiant的JSON字符串和名为picture的文件参数。 - 图片类型匹配:要根据实际图片的格式调整
ContentType,比如如果是JPG图片就改成image/jpeg。 - Stream有效性:确保
stream变量已经正确获取了图片的流(比如通过文件选择器或相机捕获得到),否则图片部分会为空。 - HttpClient复用:建议在类级别声明一个静态的
HttpClient实例(而不是每次创建新的),这样可以避免频繁创建和销毁HTTP连接,提升性能。
内容的提问来源于stack exchange,提问作者HardCorder
相关产品推荐
相关产品推荐

