我使用Angular2,TypeScript发送一个文件,以及JSON数据到服务器。

下面是我的代码:

import {Component,View,NgFor,FORM_DIRECTIVES,FormBuilder,ControlGroup} from 'angular2/angular2';
import {Http,Response,Headers} from 'http/http';


@Component({ selector: 'file-upload' })
@View({
directives: [FORM_DIRECTIVES],template: `
<h3>File Upload</h3>

<div>
     Select file:
    <input type="file" (change)="changelistener($event)">
</div>

`
})
export class FileUploadCmp {

public file: File;
public url: string;
headers: Headers;


constructor(public http: Http) {
    console.log('file upload Initialized');
    //set the header as multipart        
    this.headers = new Headers();
    this.headers.set('Content-Type','multipart/form-data');
    this.url = 'http://localhost:8080/test';
}

//onChange file listener
changelistener($event): void {
    this.postFile($event.target);
}

//send post file to server 
postFile(inputValue: any): void {

    var formData = new FormData();
    formData.append("name","Name");
    formData.append("file",inputValue.files[0]);

    this.http.post(this.url +,formData,{
            headers: this.headers

        });
}

}

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

我欣赏任何指导或建议。

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

输入更改处理程序:

/**
 * @param fileInput
 */
public psdTemplateSelectionHandler (fileInput: any){
    let FileList: FileList = fileInput.target.files;

    for (let i = 0,length = FileList.length; i < length; i++) {
        this.psdTemplates.push(FileList.item(i));
    }

    this.progressBarVisibility = true;
}

提交处理程序:

public async psdTemplateUploadHandler (): Promise<any> {
    let result: any;

    if (!this.psdTemplates.length) {
        return;
    }

    this.isSubmitted = true;

    this.fileUploadService.getobserver()
        .subscribe(progress => {
            this.uploadProgress = progress;
        });

    try {
        result = await this.fileUploadService.upload(this.uploadRoute,this.psdTemplates);
    } catch (error) {
        document.write(error)
    }

    if (!result['images']) {
        return;
    }

    this.saveUploadedTemplatesData(result['images']);
    this.redirectService.redirect(this.redirectRoute);
}

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

import { Component } from 'angular2/core';
import { Injectable } from 'angular2/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/share';

@Injectable()
export class FileUploadService {
/**
 * @param Observable<number>
 */
private progress$: Observable<number>;

/**
 * @type {number}
 */
private progress: number = 0;

private progressObserver: any;

constructor () {
    this.progress$ = new Observable(observer => {
        this.progressObserver = observer
    });
}

/**
 * @returns {Observable<number>}
 */
public getobserver (): Observable<number> {
    return this.progress$;
}

/**
 * Upload files through XMLHttpRequest
 *
 * @param url
 * @param files
 * @returns {Promise<T>}
 */
public upload (url: string,files: File[]): Promise<any> {
    return new Promise((resolve,reject) => {
        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) {
                    resolve(JSON.parse(xhr.response));
                } else {
                    reject(xhr.response);
                }
            }
        };

        FileUploadService.setUploadUpdateInterval(500);

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

/**
 * Set interval for frequency with which Observable inside Promise will share data with subscribers.
 *
 * @param interval
 */
private static setUploadUpdateInterval (interval: number): void {
    setInterval(() => {},interval);
}
}

typescript – Angular2上传的文件的更多相关文章

  1. 浅谈HTML5 FileReader分布读取文件以及其方法简介

    本篇文章主要介绍了浅谈HTML5 FileReader分布读取文件以及其方法简介,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. ios – 在导航栏下添加进度条

    我是iOS开发的新手.我想知道在iOS7中是否在UINavigationBar下发送消息时,其标题为:发送,有一个进度条正在加载,直到消息成功发送.我的问题是:>那个酒吧是进度条吗?有人可以给我一些关于如何在iOS7和iOS6上创建它的想法吗?

  3. ios – 当应用程序强制退出时如何恢复下载?

    )方法PS:谢谢你的回答我明白我的帖子有多么误导性.我会尝试工作的框架,可以允许恢复下载后,应用程序强制退出

  4. ios – 如何在UIProgressView中设置进度色调

    我想知道如何设置UIProgressView色调颜色.有时,根据颜色,默认高度不允许正确查看进度.如何解决这个问题?解决方法您可以通过此设置曲线和进度条的色调颜色;对于轨道颜色:进度条:希望这可以帮助..:)

  5. ios – 进度视图未更新 – Swift

    我正在使用Swift中的ProgressView这是我的代码即使完整提供此输出它不会在此更新进度视图解决方法针对Swift3进行了更新对UI的更改应始终发生在主/前台线程上,在这种情况下,它发生在后台队列上.使用:把它移到前台.前Swift3的旧答案对UI的更改应始终发生在主/前台线程上,它发生在后台队列上.使用:把它移到前台.

  6. ios – NSProgress奇怪的行为

    我有一个由几个子任务组成的大任务.我想为这项重大任务添加进度报告.为此,我想使用nsprogress,并根据类文档,我可以通过使用其子–父机制来做这种子任务进展.所以为了简化它,让我说我有一个由一个子任务组成的大任务.这就是我所做的:如您所见,子任务使用背景上下文来运行一些与CoreData相关的代码,而后台上下文使用主上下文作为其父上下文.这会导致进度的“fractionCompleted”属性出现一些奇怪的KVO.这是印刷品:如你所见,打印以1.0,0.5和1.0开始,然后是0.66?

  7. swift爬行篇 滑块,进度条,步进,

    滑块1.创建continous属性为true:滑块在滑动过程中响应事件,为false时则只在滑动后响应事件2.设置各区域的图片3.响应事件和Tag4.获取滑块的值进度条1创建2.设置步进控件1.创建2.响应事件continuous属性UiSlider类似3.获取步进的值

  8. Swift - 进度条UIProgressView的用法

    overridefuncviewDidLoad(){//这里放置步骤二的代码即可}二、在函数中创建进度条控件progress=UIProgressViewprogress.progress=0progress.progresstintColor=UIColor.redColor()progress.trackTintColor=UIColor.blackColor()self.view.addSubviewtimer=NSTimer.scheduledTimerWithTimeIntervaltimer.

  9. Swift UISwitch/UIProgressView/UISlider

    1.UISwitch开关视图,可以让用户快速的开关一个功能,比如蓝牙,wif等.系统默认样式:上面绿色的开启状态,下面的是关闭状态.UISwitch的构成部分:UISwitch的大小是W51H31,这固定在,在设置它的frame的时候可以不设置其大小.为什么是固定的呢?

  10. android – 根据搜索栏值更改颜色

    我试图根据搜索栏的值改变颜色.我希望颜色能够在很宽的范围内出现.这是我尝试过的,但它没有给我我想要的颜色:有任何想法吗?解决方法如果只需要明亮饱和的颜色,请使用Color.HSVToColor()而不是直接设置R,G和B组件:此代码将从红色开始设置颜色,然后平滑变为橙色,黄色,绿色,蓝色和洋红色,当进度从0变为maxProgress时返回红色

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部