我有一个现有的API,该API正在从请求正文中读取数据:
[HttpPost]
public async Task<IActionResult> Post([FromBody] CreateVm vm)
{
if (!ModelState.IsValid) return BadRequest();
var result = await _service.CreateAsync(vm);
return Ok(result);
}
出现了一个新要求,要求客户端要与视图模型一起提交图像。我的第一个想法是将IFormFile
附加到请求,在其他服务中处理它,然后继续:
public async Task<IActionResult> Post([FromBody] CreateVm vm, IFormFile file) { /* ... */}
此方法的结果是,我得到了状态码415“不受支持的媒体类型”。
我曾尝试使用邮递员将Content-Type设置为multipart/form-data
,但无济于事。
这种方法是否可行,还是需要在视图模型中添加byte[]
属性并从那里解析图像?
答案 0 :(得分:1)
我假设,因为这以前在上传要发送JSON的文件的新要求之前有效。 (将来,如果您还演示了如何进行请求,将会很有帮助。)
可以通过JSON“上传”文件,但是文件必须以JSON对象可以包含的格式发送,即JS int数组或Base64编码的字符串。 ASP.NET Core可以处理任何一个,并将值绑定到byte[]
。
没有发出请求的代码,很难为您提供更多指导,但是您基本上只需要向视图模型添加byte[]
属性,然后在发出请求时,阅读文件数据,并将其作为int数组或Base64编码的字符串(对应于该属性名称)写入JSON。例如,如果您通过JavaScript发出请求,则可以使用File API在上载输入中获取文件的数据。
IFormFile
仅适用于multipart/form-data
编码的请求,并且使用modelbinder时不能混合和匹配请求主体编码。因此,如上所述,您必须停止使用JSON或在JSON对象中发送文件,而不是使用IFormFile
。
答案 1 :(得分:-1)
我认为带有[FromForm]
标签的表单数据请求应该适合您。
using Microsoft.AspNetCore.Http;
public class CarModelPostDTO {
public string Name { get; set; }
public IFormFile Image { get; set; }
}
[HttpPost("api/car")]
public ActionResult Car([FromForm]CarModelPostDTO carDto)
{
// Getting Name
string name = carDto.Name;
// Getting Image
var image = carDto.Image;
// Saving Image on Server
if (image.Length > 0) {
using (var fileStream = new FileStream(image.FileName, FileMode.Create)) {
image.CopyTo(fileStream);
}
}
return Ok(new { status = true, message = "Car created successfully"});
}
这是完整的tutorial。