.net core 2.2 и Angular 7: IFormFile в контроллере загрузки файлов всегда равен нулю - PullRequest
1 голос
/ 05 марта 2019

При просмотре других ответов и какого-то гугла все вроде бы нормально, но мой контроллер никогда не получает никаких данных.

Api uris и тому подобное, запрос поступает на правильный контроллер

Угловой фрагмент:

component.html - мое поле ввода

<div class="input-group">
    <input type="file" #fileInput id="fileInput" (change)="stageFile()"
           accept="csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
    <div class="input-group-append">
        <button class="btn btn-primary" type="button" (click)="fileUpload()" [disabled]="!staged || uploading">
          <span *ngIf="!uploading,else loadAnim">Upload</span>
          <ng-template #loadAnim>Uploading...</ng-template>
        </button>
    </div>
</div>

component.ts - получить данные из представления

@ViewChild('fileInput') fileInput;
private file: File;
public uploading = false;
public staged = false;

constructor(private uploadService: UploadService) { }

public stageFile(): void {
    this.staged = true;
    this.file = this.fileInput.nativeElement.files[0];
    console.log(this.file)
}

public fileUpload():void {
    this.uploading = true;
    if (this.file != null)
      this.uploadService.upload(this.file).subscribe();
    this.staged = false;
    this.uploading = false;
}

services.ts - обрабатывать фактический вызов ajax

private uploadURI = environment.dataServiceURI + '/upload';

constructor(private http: HttpClient) {}

public upload(file: File): Observable<object> {
// create multipart form for file
let formData: FormData = new FormData();
formData.append('file', file, file.name);

const headers = new HttpHeaders().append('Content-Type', 'mulipart/form-data');

// POST
return this.http
  .post(this.uploadURI, formData, {headers: headers})
  .pipe(map(response => response));
}

фрагмент ядра .net

Именно здесь файл IFormFile всегда содержит ноль, и поэтому мой результат всегда равен 500

[HttpPost("upload")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult ParseData([FromForm(Name = "file")] IFormFile file)
{
    if (file == null)
       return StatusCode(500);
    (...)
    return Ok()
 }

Запрос информации о полезной нагрузке

Из сети браузера

------WebKitFormBoundarycBigaNKzS4qNcTBg 
Content-Disposition: form-data; name="file"; filename="test_data_schema.xlsx" 
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

------WebKitFormBoundarycBigaNKzS4qNcTBg--

1 Ответ

1 голос
/ 07 марта 2019

Проблема решена:

в service.ts должно быть

const headers = new HttpHeaders (). Append (' Content-Disposition ', 'multipart / form-data');

вместо

const headers = new HttpHeaders (). Append (' Content-Type ', 'multipart / form-data');

Также в .net-контроллере добавление или удаление [FromForm (Name = "file")] в качестве префикса параметра не изменяет поведение. Он прекрасно работает с ним или без него. Как указал Хьюго в комментариях, это соглашение основано, если имя параметра совпадает с именем в данных формы.

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