[英]How to send json data and formdata (files) from Angular to an ASP.NET WebAPI Controller action in one shot?
Let's say I have an ASP.NET WebAPI Controller that looks like that: 假设我有一个ASP.NET WebAPI控制器,它看起来像这样:
public class StuffController
{
[HttpGet]
[Route("api/v1/stuff/{id:int}")]
[ResponseType(typeof(Model))]
public async Task<IHttpActionResult> GetAsync(int id)
{
// ...
}
[HttpPut]
[Route("api/v1/stuff/{id:int}")]
[ResponseType(typeof(IHttpActionResult))]
public async Task<IHttpActionResult> UpdateAsync(int id, Model model)
{
// ...
}
[HttpPost]
[Route("api/v1/stuff")]
[ResponseType(typeof(IHttpActionResult))]
public async Task<IHttpActionResult> CreateAsync([FromBody] Model model)
{
// ...
}
}
Is there anyway I can send / upload / post from an Angular app (obviously in a service with HttpClient properly injected) a model (which is the json data that would be extracted from the body) and the form data containing files...)? 无论如何我可以从Angular应用程序发送/上传/发布(显然是在正确注入HttpClient的服务中)模型(这是从主体中提取的json数据)和包含文件的表单数据......) ?
The problem is... I don't really see how: 问题是......我真的不知道如何:
const formData = new FormData();
const uploadReq = new HttpRequest('POST', url, formData, {
reportProgress: true,
headers: headers
});
It's like whether...: 这就像......:
Send a MIME multipart request ( multipart/form-data
), each blob is its own FormData entry: https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects - on the server-side you can extract different parts from the request in ASP.NET by using the Request.Content.ReadAsMultipartAsync
API: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2 发送MIME多部分请求(
multipart/form-data
),每个blob都是自己的FormData条目: https : //developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects - 在服务器端您可以使用Request.Content.ReadAsMultipartAsync
API从ASP.NET中的请求中提取不同的部分: https : //docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-形数据部-2-
You will need to change your Controller Actions to not use method parameters but to read from Request
directly: 您需要更改控制器操作以不使用方法参数,而是直接从
Request
读取:
public async Task<HttpResponseMessage> PostFormData()
{
// Check if the request contains multipart/form-data.
if( !this.Request.Content.IsMimeMultipartContent() )
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
// Temporarily write the request to disk (if you use `MultipartMemoryStreamProvider` your risk crashing your server if a malicious user uploads a 2GB+ sized request)
String root = this.Server.MapPath("~/App_Data");
MultipartStreamProvider provider = new MultipartFormDataStreamProvider(root);
try
{
// Read the form data and serialize it to disk for reading immediately afterwards:
await this.Request.Content.ReadAsMultipartAsync( provider );
// This illustrates how to get the names each part, but remember these are not necessarily files: they could be form fields, JSON blobs, etc
foreach( MultipartFileData file in provider.FileData )
{
Trace.WriteLine( file.Headers.ContentDisposition.FileName );
Trace.WriteLine( "Server file path: " + file.LocalFileName );
}
return this.Request.CreateResponse( HttpStatusCode.OK );
}
catch( System.Exception e )
{
return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.