c# - C#:将模型从正文和文件作为 MultipartFormDataContent 发布
问题描述
我正在寻找一种在一个请求中发送模型和图像的方法。我试图从 body 发送我的模型,但我不知道如何发送文件。除了在不同的文件中发送图像和模型之外,还有其他方法吗?
这是我的 API 中的 POST 方法:
[HttpPost]
[Route("UploadNewEvent")]
public async Task<IActionResult> CreateNewEventAsync([FromBody] EventModel model)
{
var file = this.Request.Form.Files.LastOrDefault();
if (file != null)
{
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
using (var fileStream = new FileStream(Path.Combine(uploads, "test.jpg"), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
// do sth with model later
return Ok();
}
这是我的应用程序中的代码:
public async Task SendNewEvent(EventModel model, MediaFile photo)
{
var uri = $"{baseUri}api/User/Event/CreateNewEvent";
if (photo != null)
{
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StreamContent(photo.GetStream()), "\"file\"", $"\"{photo.Path}\"");
var httpClient = new HttpClient();
var jsonObject = JsonConvert.SerializeObject(model);
var stringContent = new StringContent(jsonObject, Encoding.UTF8, "application/json");
var httpResponseMessage = await httpClient.PostAsync(uri, stringContent);
}
}
解决方案
为了传递带有文件参数的模型,您需要将数据作为表单数据发布。
请按照以下步骤操作:
更改
FromBody
为FromForm
[HttpPost] [Route("UploadNewEvent")] public async Task<IActionResult> CreateNewEventAsync([FromForm] EventModel model) { // do sth with model later return Ok(); }
更改客户端代码以发送表单数据而不是 json 字符串
var uri = $"https://localhost:44339/UploadNewEvent"; FileStream fileStream = new FileStream(@"filepath\T1.PNG", FileMode.Open); var multipartContent = new MultipartFormDataContent(); multipartContent.Add(new StreamContent(fileStream), "\"file\"", @"filepath\T1.PNG"); // EventModel other fields multipartContent.Add(new StringContent("2"), "Id"); multipartContent.Add(new StringContent("Tom"), "Name"); var httpClient = new HttpClient(); var httpResponseMessage = httpClient.PostAsync(uri, multipartContent).Result;
事件模型
public class EventModel { public int Id { get; set; } public string Name { get; set; } public IFormFile File { get; set; } }
推荐阅读
- ruby-on-rails - Rails 在导入 CSV 时插入带有 ID 的列
- python - 如果它的文件夹在另一个应用程序中打开,则无法在 python 中导入我自己的模块
- html - 如何允许用户在 JSF 中输入数字 (+/-) 和 1 位小数
- android - 尝试将 apk 上传到 Firebase App Distribution 时出错
- c# - 在创建新实体模型时,是否可以让 VS 自动创建视图模型、自动映射器映射和流利的验证器类?
- git - 从磁盘中删除文件但保留 Git 克隆目录;归档本地仓库
- c# - C# SSH 隧道 Postgres 数据库连接
- spring - Spring boot 启动 #!NL!# using intellij
- r - 将 r 中用逗号分隔的两个值相加
- text - 文本小部件数据未居中