ASPNET Core 2.1 чтение / поток FormCollection - PullRequest
0 голосов
/ 23 января 2019

Я имею дело с большими нагрузками при загрузке изображений на сервер, поэтому я обновил классический [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);
                }
            });
        });
     }

Любые отзывы действительно приветствуются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...