【发布时间】:2017-09-26 05:39:38
【问题描述】:
如何在asp.net core web api中上传Multipart-form-data文件?是否可以在一个 POST 中同时 POST JSON 和图像?
【问题讨论】:
如何在asp.net core web api中上传Multipart-form-data文件?是否可以在一个 POST 中同时 POST JSON 和图像?
【问题讨论】:
更新-.net core 2.0 +
使用 .net core,您可以利用新的IFormFile 界面在同一个帖子中上传图片和属性。例如:
[HttpPost("content/upload-image")]
public async Task<IActionResult> UploadImage(MyFile upload)
MyFile 类可能如下所示:
public class MyFile
{
public string userId { get; set; }
public IFormFile File { get; set; }
// Other properties
}
您可以通过以下方式访问properties 和file:
var file = upload.File // This is the IFormFile file
var param = upload.userId // param
要将文件持久化/保存到磁盘,您可以执行以下操作:
using (var stream = new FileStream(path, FileMode.Create))
{
await file.File.CopyToAsync(stream);
}
.NET 框架
是的。根据您使用的客户端 Framework,您可以为 Content Type-Multipart 配置您的 Web API,然后执行以下操作:
[HttpPost]
[Route("content/upload-image")]
public async Task<HttpResponseMessage> Post()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
// enter code here
}
定义和设置您的图像将被保存的目录。
var root = HttpContext.Current.Server.MapPath("~/Content/Images/");
if (!Directory.Exists(root))
{
Directory.CreateDirectory(root);
}
设置 StreamProvider 并尝试获取 model 数据,即您提到的 JSON。
var streamProvider = new MultipartFormDataStreamProvider(root);
var result =
await Request.Content.ReadAsMultipartAsync(streamProvider);
if (result.FormData["model"] == null)
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
现在访问请求中的文件。
try
{
// Deserialize model data to your own DTO
var model = result.FormData["model"];
var formDto = JsonConvert
.DeserializeObject<MyDto>(model, new IsoDateTimeConverter());
var files = result.FileData.ToList();
if (files != null)
{
foreach (var file in files)
{
// Do anything with the file(s)
}
}
}
【讨论】:
IFormFile 接口是在 .net core 中引入的。在这里看看:docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads.