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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:08:23