C# 如何通过API从winform应用程序上传照片?

C# 如何通过API从winform应用程序上传照片?,c#,rest,asp.net-web-api,.net-core,C#,Rest,Asp.net Web Api,.net Core,我有两个项目。一个是Windows窗体项目,另一个是.NET Core 2.0 Web API项目。我可以从Windows窗体应用程序调用我的Web API,并可以调用基本的CRUD操作 我需要贴张照片。我该怎么做?我的帖子是这样的: private async void AddStudent() { var p = new Student { FirstName = "Johdn", LastName = "Doe&

我有两个项目。一个是Windows窗体项目,另一个是.NET Core 2.0 Web API项目。我可以从Windows窗体应用程序调用我的Web API,并可以调用基本的CRUD操作

我需要贴张照片。我该怎么做?我的帖子是这样的:

private async void AddStudent()
{
    var p = new Student
    {
        FirstName = "Johdn",
        LastName = "Doe",
        Avatar = "Image"; // my photo
    };

    using (var client = new HttpClient())
    {
        var serializedStudent = JsonConvert.SerializeObject(p);
        var content = new StringContent(serializedStudent, Encoding.UTF8, "application/json");
        var result = await client.PostAsync(URI, content);
    }
}
Web API实现如下所示:

public void Post([FromBody] Student student)
{
    var insideStudent = _dbContext.Students.FirstOrDefault(cus => cus.Id == student.Id);
    if (insideStudent != null)
    {
        insideStudent.FirstName = student.FirstName;
        insideStudent.LastName = student.LastName;
        _dbContext.SaveChanges();
    } else {
        _dbContext.Students.Add(new Student
        {
            FirstName = student.FirstName,
            LastName = student.LastName,
            Avatar = student.Avatar // my photo
        });
        _dbContext.SaveChanges();
    }
}

但是如何将图像发送到我的Web API?

MultipartFormDataContent
可以是一个选项。假设
Student.Avatar
是一个字节数组:

public byte[] Avatar { get; set; }
并且您拥有图像的
,您可以将其作为字节数组内容与字符串内容一起发送:

    private async void AddStudent()
    {
        var stream = //gets image stream...
        var p = new Student
        {
            FirstName = "Johdn",
            LastName = "Doe",
        };
        using (var client = new HttpClient())
        {
            var serializedStudent = JsonConvert.SerializeObject(p);
            var stringContent = new StringContent(serializedStudent, Encoding.UTF8, "application/json");
            var multipartContent = new MultipartFormDataContent();
            using (var mem = new MemoryStream())
            {
                await stream.CopyToAsync(mem);
                var byteContent = new ByteArrayContent(mem.ToArray());
                multipartContent.Add(byteContent, "files", "my file");
                multipartContent.Add(new StringContent(p.FirstName), "FirstName");
                multipartContent.Add(new StringContent(p.LastName), "LastName");
                var response = await client.PostAsync(URI, multipartContent);
            }
        }
    }
然后,您可以在服务器端接收这些信息:

    [HttpPost]
    public async void Post([FromForm]Student student)
    {
        var form = Request.Form;
        var insideStudent = _dbContext.Students.FirstOrDefault(cus => cus.Id == student.Id);
        if (insideStudent != null)
        {
            insideStudent.FirstName = student.FirstName;
            insideStudent.LastName = student.LastName;
            _dbContext.SaveChanges();
        }
        else
        {
            var newStudent = new Student
            {
                FirstName = student.FirstName,
                LastName = student.LastName
            };
            if(form.Files.Any())
            {
                using (var stream = new MemoryStream())
                {
                    await form.Files[0].CopyToAsync(stream);
                    newStudent.Avatar = stream.ToArray();
                }
            }
            _dbContext.Students.Add(newStudent);
            _dbContext.SaveChanges();
        }
    }

谢谢你的回答。但是我得到了这个错误;请求失败,写入流的字节数超过了内容长度字节数大小specified@user1436795,你在哪里找到错误的?客户端还是服务器?客户端。代码未转到服务器。当调用client.PostAsync代码时。它可能是一个文件大小限制。尝试使用小文件。顺便说一句,你获取头像的代码流是什么样子的?公共静态流到流(图像图像,图像格式){var stream=new System.IO.MemoryStream();Image.Save(流,格式);stream.Position=0;return stream;}我用这种方式