【问题标题】:How to upload files(multipart) using angularjs2如何使用 angularjs2 上传文件(多部分)
【发布时间】:2017-02-05 11:07:24
【问题描述】:

angular2 是否支持多部分表单提交,有可用的示例吗?

非常感谢任何指向特定于此的文档的链接

查看来自 angular github https://github.com/angular/angular/issues/6030的帖子

**** 稍后通过使用 XMLHttpRequest 的工作演示更新 ****

任何展示将FormData 作为http 的一部分发送的示例,

下面是一个对我来说很好用的代码草案,但想知道http是否支持同样的代码

HTML

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

角度2

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);

【问题讨论】:

    标签: angular multipart


    【解决方案1】:

    示例 sn-p 传递包含图像的 formData

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

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

    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);
          }
        });
      }
    }
    

    【讨论】:

    • 很好的答案,我见过的大多数答案都使用 Javascript 而不是 Angular。我是否建议在您的答案中添加关键代码,以便在链接断开时答案仍然相关。
    【解决方案2】:

    ng2-file-upload 将成为您的分段上传指南。 AngularJs 也有 ng-file-upload 以防你想看看指令。

    【讨论】:

    • 我可以同时使用字段和文件进行普通表单发布
    • 是的,你可以。记得在 ngInit() 中重写 onBeforeUploadItem 以在提交前捕获所有数据。
    • ng2-file-upload 是否支持发送块和大文件?
    • 嘿伙计,对不起,我已经有一段时间没有使用它了。您可能需要查看他们的文档。
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 2023-03-11
    • 2021-01-19
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多