WedX - журнал о программировании и компьютерных науках

Как загрузить файл в Angular2

Я должен отправить форму вместе с изображением. Я пробовал этот код (несколько способов), но у меня не сработало. есть ли у кого-нибудь работающая демонстрация загрузки файлов с использованием angular2, пожалуйста, помогите мне.

компонент.html

    <form class="form-horizontal" role="form" >

        <div class="form-group">
            <label class="control-label col-sm-4" for="myname" style="">Name<span class="asterisk">*</span></label>
            <div class="col-sm-7">
                <div>
                    <input type="text" class="form-control" id="myname"
                    [(ngModel)]="myfile.name">                        
                </div>                  
            </div>                               
        </div>        


        <div class="form-group">
            <label class="control-label col-sm-4" for="myimage">Image</label>
            <div class="col-sm-7">
                <div>
                    <input type="file" (change)="fileChangeEvent($event)" placeholder="Upload file..." />                         
                </div>   
            </div>
        </div>


        <div class="form-group">        
        <div class="text-center">
            <button type="button" (click)="upload()">Upload</button>             
        </div>
        </div>
  </form>

компонент.ts

     myfile={
                "name":"Mubashshir",               
                "image":''
     }

     fileChangeEvent(fileInput: any){
        this.myfile.image = fileInput.target.files;        
     }

     upload(){
          this.base_path_service.PostRequest('https://128.199.190.109/api/school/schoolDetail/',this.myfile)
            .subscribe(
                data => {
                            console.log("data submitted");                        
                        },
                err => console.log(err),
                () =>{
                     console.log('Authentication Complete');                    

                }
            );
      }


Ответы:


1

Фактически, класс Http на данный момент не поддерживает это.

Для этого вам нужно использовать базовый объект XHR:

import {Injectable} from 'angular2/core';
import {Observable} from 'rxjs/Rx';

@Injectable()
export class UploadService {
  constructor () {
    this.progress$ = Observable.create(observer => {
      this.progressObserver = observer
    }).share();
  }

  private makeFileRequest (url: string, params: string[], files: File[]): Observable {
    return Observable.create(observer => {
      let formData: FormData = new FormData(),
        xhr: XMLHttpRequest = new XMLHttpRequest();

      for (let i = 0; i < files.length; i++) {
        formData.append("uploads[]", files[i], files[i].name);
      }

      xhr.onreadystatechange = () => {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            observer.next(JSON.parse(xhr.response));
            observer.complete();
          } else {
            observer.error(xhr.response);
          }
        }
      };

      xhr.upload.onprogress = (event) => {
        this.progress = Math.round(event.loaded / event.total * 100);

        this.progressObserver.next(this.progress);
      };

      xhr.open('POST', url, true);
      xhr.send(formData);
    });
  }
}

Подробнее см. этот plunkr: https://plnkr.co/edit/ozZqbxIorjQW15BrDFrg?p=info< /а>.

В репозитории Angular есть проблема и ожидающий PR по этому поводу:

14.03.2016
  • Как вы можете получить ответ от этого? И разве теперь это не должно быть Promise, а не Observable? 09.09.2016
  • Эй, я получаю ошибки синтаксического анализа с этим ответом. ИСКЛЮЧЕНИЕ: SyntaxError: JSON.parse: непредвиденный символ в строке 1 столбца 1 JSON datavendor.js:1617 ИСКЛЮЧЕНИЕ: SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 JSON datavendor.js:1617:2286 STACKTRACE: vendor.js:1617:2286 ................ Кто-нибудь еще сталкивался с этой проблемой? 23.09.2016
  • В финальном выпуске angular вам больше не нужно возиться с базовым объектом XHR, см. этот ответ: stackoverflow.com/a/39862337 /3351622 17.11.2016

  • 2

    ваш служебный файл http:

    import { Injectable } from "@angular/core";
    import { ActivatedRoute, Router } from '@angular/router';
    import { Http, Headers, Response, Request, RequestMethod, URLSearchParams, RequestOptions } from "@angular/http";
    import {Observable} from 'rxjs/Rx';
    import { Constants } from './constants';
    declare var $: any;
    
    @Injectable()
    export class HttpClient {
      requestUrl: string;
      responseData: any;
      handleError: any;
    
      constructor(private router: Router, 
      private http: Http, 
      private constants: Constants, 
      ) {
        this.http = http;
      }
    
      postWithFile (url: string, postData: any, files: File[]) {
    
        let headers = new Headers();
        let formData:FormData = new FormData();
        formData.append('files', files[0], files[0].name);
        // For multiple files
        // for (let i = 0; i < files.length; i++) {
        //     formData.append(`files[]`, files[i], files[i].name);
        // }
    
        if(postData !=="" && postData !== undefined && postData !==null){
          for (var property in postData) {
              if (postData.hasOwnProperty(property)) {
                  formData.append(property, postData[property]);
              }
          }
        }
        var returnReponse = new Promise((resolve, reject) => {
          this.http.post(this.constants.root_dir + url, formData, {
            headers: headers
          }).subscribe(
              res => {
                this.responseData = res.json();
                resolve(this.responseData);
              },
              error => {
                this.router.navigate(['/login']);
                reject(error);
              }
          );
        });
        return returnReponse;
      }
    }
    

    вызов вашей функции (файл компонента):

    onChange(event) {
        let file = event.srcElement.files;
        let postData = {field1:"field1", field2:"field2"}; // Put your form data variable. This is only example.
        this._service.postWithFile(this.baseUrl + "add-update",postData,file).then(result => {
            console.log(result);
        });
    }
    

    ваш HTML-код:

    <input type="file" class="form-control" name="documents" (change)="onChange($event)" [(ngModel)]="stock.documents" #documents="ngModel">
    
    14.11.2016
  • Это не сработает, так как http post не поддерживает FormData, ваши данные не будут переданы на сервер, github.com/angular/angular/issues/13241 26.10.2017

  • 3

    Улучшенный метод onChange():

    file: File;
      onChange(event: EventTarget) {
            let eventObj: MSInputMethodContext = <MSInputMethodContext> event;
            let target: HTMLInputElement = <HTMLInputElement> eventObj.target;
            let files: FileList = target.files;
            this.file = files[0];
            console.log(this.file);
        }
    
    04.01.2017
  • Наконец-то я получил файловый объект!! 24.08.2017

  • 4

    Вот версия Angular 2

    Нам нужно было реализовать функцию ввода файла перетаскиванием в одно из наших приложений Angular 2.

    Для этого мы выбрали ng-file-upload.

    Мы попытались перейти на страницу справки. Как было предложено, реализовано drag-upload-input.html & drag-upload-input.component.ts следующим образом:

    перетащите-upload-input.html

    <!-- we only need single file upload -->
    <input type="file" ng2FileSelect [uploader]="uploader" />
    

    перетащите-upload-input.component.ts

    import { Component } from '@angular/core';
    import { FileUploader } from 'ng2-file-upload';
    
    // const URL = '/api/';
    const URL = 'https://evening-anchorage-3159.herokuapp.com/api/';
    
    @Component({
      moduleId: module.id,
      selector: 'drag-upload-input',
      templateUrl: './drag-upload-input.html'
    })
    export class DragUploadInput {
      public uploader: FileUploader = new FileUploader({ url: URL });
      public hasBaseDropZoneOver: boolean = false;
      public hasAnotherDropZoneOver: boolean = false;
    
      public fileOverBase(e: any): void {
        this.hasBaseDropZoneOver = e;
      }
    
      public fileOverAnother(e: any): void {
        this.hasAnotherDropZoneOver = e;
      }
    }
    

    app.module.ts получил FileUploadModule вот так:

    // File upload modules
    import { FileUploadModule } from 'ng2-file-upload';
    import { DragUploadInput } from './file-upload/drag-upload-input.component';
    
    //other imports
    
    @NgModule({
      imports: [ ... other imports
    FileUploadModule
    ],
      declarations: [  ... other declarations
    DragUploadInput],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    

    И systemjs.config.js выглядит так:

    (function (global) {
      System.config({
        // map tells the System loader where to look for things
        map: {
          // other libraries
          'ng2-file-upload': 'node_modules/ng2-file-upload',
        },
        packages: {
          // other packages
          ng2-file-upload': {
            main: 'ng2-file-upload.js',
            defaultExtension: 'js'
          }
        }
      });
    })(this);
    

    источник

    08.06.2017
  • привет, а куда файл закачал? Как мы можем настроить его? 26.09.2017
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]