我正在尝试创建一个处理存储文件的Web API。
Asp.Net核心1.0+框架附带IFormFile接口,该接口允许将文件绑定到视图模型。有关在ASP.NET Core中上传文件的文档指出以下内容
IFormFile可以直接用作操作方法参数或绑定模型属性。
当我将其IFormFile
用作操作方法的参数时,它没有任何问题。但就我而言,我想将其用作模型的属性,因为除了绑定自定义验证规则外,我还希望绑定其他值。这是我的视图模型。
public class NewFile
{
[Required]
[MinFileSize(125), MaxFileSize(5 * 1024 * 1024)]
[AllowedExtensions(new[] { ".jpg", ".png", ".gif", ".jpeg", ".tiff" })]
public IFormFile File { get; set; }
[Required]
public int? CustomField1 { get; set; }
[Required]
public int? CustomField2 { get; set; }
[Required]
public int? CustomField3 { get; set; }
}
这是我的客户请求代码和接受文件的服务器代码。为了简单起见,两种方法都放在同一控制器中。但实际上,“客户端”方法将被放置在一个单独的应用程序中,该应用程序通过文件进行发送。
[ApiController, Route("api/[controller]")]
public class FilesController : ControllerBase
{
[HttpGet("client")]
public async Task<IActionResult> Client()
{
using HttpClient client = new HttpClient();
// we need to send a request with multipart/form-data
var multiForm = new MultipartFormDataContent
{
// add API method parameters
{ new StringContent("CustomField1"), "1" },
{ new StringContent("CustomField2"), "1234" },
{ new StringContent("CustomField3"), "5" },
};
// add file and directly upload it
using FileStream fs = System.IO.File.OpenRead("C:/1.jpg");
multiForm.Add(new StreamContent(fs), "file", "1.jpg");
// send request to API
var responce = await client.PostAsync("https://localhost:123/api/files/store", multiForm);
return Content("Done");
}
[HttpPost("store")]
public async Task<IActionResult> Store(NewFile model)
{
if (ModelState.IsValid)
{
try
{
var filename = MakeFileName(model, Path.GetFileName(model.File.FileName));
Directory.CreateDirectory(Path.GetDirectoryName(filename));
using var stream = new FileStream(filename, FileMode.Create);
await model.File.CopyToAsync(stream);
return PhysicalFile(filename, "application/octet-stream");
}
catch (Exception e)
{
return Problem(e.Message);
}
}
// Are there a better way to display validation errors when using Web API?
var errors = string.Join("; ", ModelState.Values.SelectMany(v => v.Errors).Select(v => v.ErrorMessage));
return Problem(errors);
}
}
当我发出请求时,我收到以下错误,但store
由于我在该处放置了一个断点,但该请求从未到达该方法,但从未在该处出现。
StatusCode:415,ReasonPhrase:“不受支持的媒体类型”,版本:1.1,内容:System.Net.Http.HttpConnectionResponseContent
如何正确地将文件发送到服务器并将其绑定到File
视图模型上的属性?
ApiController
默认情况下,期望JSON,除非另有明确说明
用于[FromForm]
在请求正文中使用表单数据绑定模型。
public async Task<IActionResult> Store([FromForm]NewFile model) {
//...
}.
CustomField1,CustomField2和CustomField3`为空,即使它们按照我在原始问题中看到的方式发送
客户端没有正确发送其他字段。您已切换内容和字段名称
var multiForm = new MultipartFormDataContent {
// add API method parameters
{ new StringContent("1"), "CustomField1" },
{ new StringContent("1234"), "CustomField2" },
{ new StringContent("5"), "CustomField3" },
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句