Я имею дело с большими нагрузками при загрузке изображений на сервер, поэтому я обновил классический [HttpPost]
+ [FromBody]
, чтобы начать использовать FormCollection
и отправлять фактический контент кусками.Однако пока все хорошо, чтобы заставить его работать, у меня был следующий код:
[HttpPost]
[Authorize]
[DisableRequestSizeLimit]
public async Task<IActionResult> PostAsync()
{
var form = await Request.ReadFormAsync();
var myObject= JsonConvert.DeserializeObject<MyObject>(form["data"]);
for(var i = 0; i < form.Files.Count; ++i)
{
myObject.Images[i].File = form.Files.ElementAt(i) as FormFile;
}
...more stuff and return 201 if created otherwise 202
}
Мой первый вопрос - узнать, действительно ли ReadFormAsync действительно верен.Я обнаружил, что если я не укажу это, поток данных начнет отправляться, однако API также начнет запускать метод, и на самом деле данные не поступили, если это имеет смысл.Я не уверен, есть ли что-то из коробки, которое делает это для меня - что-то вроде атрибута или чего-то еще (я ищу здесь лучшие практики).
Тогда мой второй вопрос заключается в том, что я на самом делеЯ должен разделить мои данные между файлами (чтобы перейти к разделу form.Files и фактическому объекту, который я сериализую как Json в пользовательском интерфейсе. Я не уверен, что это также правильно или это нужно делать по-другому.
Я использую пользовательский интерфейс Angular 7 для выполнения запроса:
public post(formData: FormData): Promise<boolean> {
const headers = new HttpHeaders({
'Authorization': this.authService.getAuthorizationHeaderValue()
});
const uploadReq = new HttpRequest('POST', `${environment.apiBaseUrl}/myEndpoint/`, formData, {
reportProgress: false,
headers: headers
});
return new Promise<boolean>((r) => {
this.http.request<boolean>(uploadReq).subscribe(event => {
if (event.type === HttpEventType.Response) {
r(event.body);
}
});
});
}
Любые отзывы действительно приветствуются