typescript – Angular2上传的文件

前端之家收集整理的这篇文章主要介绍了typescript – Angular2上传的文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用Angular2,TypeScript发送一个文件,以及JSON数据到服务器。

下面是我的代码

  1. import {Component,View,NgFor,FORM_DIRECTIVES,FormBuilder,ControlGroup} from 'angular2/angular2';
  2. import {Http,Response,Headers} from 'http/http';
  3.  
  4.  
  5. @Component({ selector: 'file-upload' })
  6. @View({
  7. directives: [FORM_DIRECTIVES],template: `
  8. <h3>File Upload</h3>
  9.  
  10. <div>
  11. Select file:
  12. <input type="file" (change)="changeListener($event)">
  13. </div>
  14.  
  15. `
  16. })
  17. export class FileUploadCmp {
  18.  
  19. public file: File;
  20. public url: string;
  21. headers: Headers;
  22.  
  23.  
  24. constructor(public http: Http) {
  25. console.log('file upload Initialized');
  26. //set the header as multipart
  27. this.headers = new Headers();
  28. this.headers.set('Content-Type','multipart/form-data');
  29. this.url = 'http://localhost:8080/test';
  30. }
  31.  
  32. //onChange file listener
  33. changeListener($event): void {
  34. this.postFile($event.target);
  35. }
  36.  
  37. //send post file to server
  38. postFile(inputValue: any): void {
  39.  
  40. var formData = new FormData();
  41. formData.append("name","Name");
  42. formData.append("file",inputValue.files[0]);
  43.  
  44. this.http.post(this.url +,formData,{
  45. headers: this.headers
  46.  
  47. });
  48. }
  49.  
  50. }

如何将formData转换为字符串并将其发送到服务器。我记得在Angular1,你会使用transformRequest。

我欣赏任何指导或建议。

看看我的代码,但要注意。我使用async / await,因为最新的Chrome beta可以读取任何es6代码,这是通过TypeScript获得编译。所以,你必须用.then()替换asyns / await。

输入更改处理程序:

  1. /**
  2. * @param fileInput
  3. */
  4. public psdTemplateSelectionHandler (fileInput: any){
  5. let FileList: FileList = fileInput.target.files;
  6.  
  7. for (let i = 0,length = FileList.length; i < length; i++) {
  8. this.psdTemplates.push(FileList.item(i));
  9. }
  10.  
  11. this.progressBarVisibility = true;
  12. }

提交处理程序:

  1. public async psdTemplateUploadHandler (): Promise<any> {
  2. let result: any;
  3.  
  4. if (!this.psdTemplates.length) {
  5. return;
  6. }
  7.  
  8. this.isSubmitted = true;
  9.  
  10. this.fileUploadService.getObserver()
  11. .subscribe(progress => {
  12. this.uploadProgress = progress;
  13. });
  14.  
  15. try {
  16. result = await this.fileUploadService.upload(this.uploadRoute,this.psdTemplates);
  17. } catch (error) {
  18. document.write(error)
  19. }
  20.  
  21. if (!result['images']) {
  22. return;
  23. }
  24.  
  25. this.saveUploadedTemplatesData(result['images']);
  26. this.redirectService.redirect(this.redirectRoute);
  27. }

FileUploadService。该服务还存储上传进度$ property,在其他地方,你可以订阅它,并获得新的价值每500ms。

  1. import { Component } from 'angular2/core';
  2. import { Injectable } from 'angular2/core';
  3. import { Observable } from 'rxjs/Observable';
  4. import 'rxjs/add/operator/share';
  5.  
  6. @Injectable()
  7. export class FileUploadService {
  8. /**
  9. * @param Observable<number>
  10. */
  11. private progress$: Observable<number>;
  12.  
  13. /**
  14. * @type {number}
  15. */
  16. private progress: number = 0;
  17.  
  18. private progressObserver: any;
  19.  
  20. constructor () {
  21. this.progress$ = new Observable(observer => {
  22. this.progressObserver = observer
  23. });
  24. }
  25.  
  26. /**
  27. * @returns {Observable<number>}
  28. */
  29. public getObserver (): Observable<number> {
  30. return this.progress$;
  31. }
  32.  
  33. /**
  34. * Upload files through XMLHttpRequest
  35. *
  36. * @param url
  37. * @param files
  38. * @returns {Promise<T>}
  39. */
  40. public upload (url: string,files: File[]): Promise<any> {
  41. return new Promise((resolve,reject) => {
  42. let formData: FormData = new FormData(),xhr: XMLHttpRequest = new XMLHttpRequest();
  43.  
  44. for (let i = 0; i < files.length; i++) {
  45. formData.append("uploads[]",files[i],files[i].name);
  46. }
  47.  
  48. xhr.onreadystatechange = () => {
  49. if (xhr.readyState === 4) {
  50. if (xhr.status === 200) {
  51. resolve(JSON.parse(xhr.response));
  52. } else {
  53. reject(xhr.response);
  54. }
  55. }
  56. };
  57.  
  58. FileUploadService.setUploadUpdateInterval(500);
  59.  
  60. xhr.upload.onprogress = (event) => {
  61. this.progress = Math.round(event.loaded / event.total * 100);
  62.  
  63. this.progressObserver.next(this.progress);
  64. };
  65.  
  66. xhr.open('POST',url,true);
  67. xhr.send(formData);
  68. });
  69. }
  70.  
  71. /**
  72. * Set interval for frequency with which Observable inside Promise will share data with subscribers.
  73. *
  74. * @param interval
  75. */
  76. private static setUploadUpdateInterval (interval: number): void {
  77. setInterval(() => {},interval);
  78. }
  79. }

猜你在找的Angularjs相关文章