如何使用angularjs2上传文件(多部分)
How to upload files(multipart) using angularjs2
angular2 是否支持多部分表单提交,有可用的示例吗?
非常感谢任何 link 与此相关的文档
参见 post 来自 angular github https://github.com/angular/angular/issues/6030
**** 稍后更新了使用 XMLHttpRequest 的工作演示 ****
作为 http
、
的一部分发送 FormData
的任何示例
下面是一个适合我的代码草案,但想知道 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);
ng2-file-upload will be your guide for multipart upload. AngularJs also have ng-file-upload 如果您想查看指令。
用于传递包含图像的 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);
}
});
}
}
angular2 是否支持多部分表单提交,有可用的示例吗?
非常感谢任何 link 与此相关的文档
参见 post 来自 angular github https://github.com/angular/angular/issues/6030
**** 稍后更新了使用 XMLHttpRequest 的工作演示 ****
作为 http
、
FormData
的任何示例
下面是一个适合我的代码草案,但想知道 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);
ng2-file-upload will be your guide for multipart upload. AngularJs also have ng-file-upload 如果您想查看指令。
用于传递包含图像的 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);
}
});
}
}