C# 如何通过API从winform应用程序上传照片?
我有两个项目。一个是Windows窗体项目,另一个是.NET Core 2.0 Web API项目。我可以从Windows窗体应用程序调用我的Web API,并可以调用基本的CRUD操作 我需要贴张照片。我该怎么做?我的帖子是这样的: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&
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;}我用这种方式