File Upload In Angular?

前端 未结 14 2309
执念已碎
执念已碎 2020-11-22 08:10

I know this is very a general question but I am failing to upload a file in Angular 2. I have tried

1) http://valor-software.com/ng2-file-upload/ and

2) h

14条回答
  •  感情败类
    2020-11-22 08:50

    This simple solution worked for me: file-upload.component.html

    And then do the upload in the component directly with XMLHttpRequest.

    import { Component, OnInit, ViewChild } from '@angular/core';
    
    @Component({
      selector: 'app-file-upload',
      templateUrl: './file-upload.component.html',
      styleUrls: ['./file-upload.component.css']
    })
    export class FileUploadComponent implements OnInit {
    
      @ViewChild('fileInput') fileInput;
    
      constructor() { }
    
      ngOnInit() {
      }
    
      private upload() {
        const fileBrowser = this.fileInput.nativeElement;
        if (fileBrowser.files && fileBrowser.files[0]) {
          const formData = new FormData();
          formData.append('files', fileBrowser.files[0]);
          const xhr = new XMLHttpRequest();
          xhr.open('POST', '/api/Data/UploadFiles', true);
          xhr.onload = function () {
            if (this['status'] === 200) {
                const responseText = this['responseText'];
                const files = JSON.parse(responseText);
                //todo: emit event
            } else {
              //todo: error handling
            }
          };
          xhr.send(formData);
        }
      }
    
    }
    

    If you are using dotnet core, the parameter name must match the from field name. files in this case:

    [HttpPost("[action]")]
    public async Task> UploadFiles(List files)
    {
      return await _binaryService.UploadFilesAsync(files);
    }
    

    This answer is a plagiate of http://blog.teamtreehouse.com/uploading-files-ajax

    Edit: After uploading, you have to clear the file-upload so that the user can select a new file. And instead of using XMLHttpRequest, maybe it is better to use fetch:

    private addFileInput() {
        const fileInputParentNative = this.fileInputParent.nativeElement;
        const oldFileInput = fileInputParentNative.querySelector('input');
        const newFileInput = document.createElement('input');
        newFileInput.type = 'file';
        newFileInput.multiple = true;
        newFileInput.name = 'fileInput';
        const uploadfiles = this.uploadFiles.bind(this);
        newFileInput.onchange = uploadfiles;
        oldFileInput.parentNode.replaceChild(newFileInput, oldFileInput);
      }
    
      private uploadFiles() {
        this.onUploadStarted.emit();
        const fileInputParentNative = this.fileInputParent.nativeElement;
        const fileInput = fileInputParentNative.querySelector('input');
        if (fileInput.files && fileInput.files.length > 0) {
          const formData = new FormData();
          for (let i = 0; i < fileInput.files.length; i++) {
            formData.append('files', fileInput.files[i]);
          }
    
          const onUploaded = this.onUploaded;
          const onError = this.onError;
          const addFileInput = this.addFileInput.bind(this);
          fetch('/api/Data/UploadFiles', {
            credentials: 'include',
            method: 'POST',
            body: formData,
          }).then((response: any) => {
            if (response.status !== 200) {
              const error = `An error occured. Status: ${response.status}`;
              throw new Error(error);
            }
            return response.json();
          }).then(files => {
            onUploaded.emit(files);
            addFileInput();
          }).catch((error) => {
            onError.emit(error);
          });
        }
    

    https://github.com/yonexbat/cran/blob/master/cranangularclient/src/app/file-upload/file-upload.component.ts

提交回复
热议问题