web-dev-qa-db-ja.com

anglejs 2を使用してファイル(マルチパート)をアップロードする方法

Angular2はマルチパートフォーム送信をサポートしていますか、利用可能な例はありますか?

これに固有のドキュメントへのリンクは大歓迎です

angular github https://github.com/angular/angular/issues/60 からの投稿を参照してください

**** XMLHttpRequestを使用した作業デモで後で更新****

FormDataの一部としてhttpを送信する例を示すすべての例、

以下はドラフトコードで、私にとっては問題なく機能しますが、httpでサポートされているかどうかを知りたい

HTML

  <input id="single_f_fileup" [(ngModel)]="model.image" type="file" (change)="selectFile($event)" name="single_fileup" />

ANGULAR2

selectFile($event): void {
 var files = $event.target.files || $event.srcElement.files;
        var file = files[0];
        let formData = new FormData();
        formData.append("single_fileup", file);
        formData.append('key1', 'value1');
        formData.append('key2', 'value2');
       var req = new XMLHttpRequest();
       req.open("POST", "/api/fileupload");
       req.send(formData);
}

NODEJS 6.2

var multer  = require('multer');
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
  router.post('/api/fileupload', upload.single('single_fileup'), function(req, res, next){
        console.log(req.body,req.file);
});

以下のコードを機能させる方法は?

 this.http.post('/api/fileupload', formData)
            .map(this.extractData)
            .catch(this.handleError);
9
tomalex

画像を含むformDataを渡すサンプルスニペット

https://Gist.github.com/arciisine/ee57727e56cbc5e83739b2c24fd69658

https://github.com/angular/angular/issues/60

import { Component, Input, AfterViewInit } from '@angular/core';
import { NgModel, DefaultValueAccessor, NgControl } from '@angular/forms';
import { Http, Headers, RequestOptions } from '@angular/http';

@Component({
  selector: 'app-file-uploader',
  template: '<input type="file" (change)="updated($event);">',
  providers: [NgModel, DefaultValueAccessor]
})
export class FileUploaderComponent implements AfterViewInit {

  static ROOT = '/rest/asset';

  @Input() private companyId: string = '';
  private value: string;
  private changeListener: Function;

  constructor(private http: Http, private input: NgControl) {
    this.input.valueAccessor = this;
  }

  ngAfterViewInit() {
  }

  writeValue(obj: any): void {
    this.value = obj;
  }

  registerOnChange(fn: any): void {
    this.changeListener = fn;
  }

  registerOnTouched(fn: any): void {

  }

  updated($event) {
    const files = $event.target.files || $event.srcElement.files;
    const file = files[0];
    const formData = new FormData();
    formData.append('file', file);

    const headers = new Headers({});
    let options = new RequestOptions({ headers });
    let url = FileUploaderComponent.ROOT + (this.companyId ? '/' + this.companyId : '');

    this.http.post(url, formData, options).subscribe(res => {
      let body = res.json();
      this.value = body.filename;

      if (this.changeListener) {
        this.changeListener(this.value);
      }
    });
  }
}
14
tomalex

ng2-file-upload は、マルチパートアップロードのガイドになります。 AngularJsには、ディレクティブを確認したい場合のために ng-file-upload もあります。

4
Cyclotron3x3