angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)

首先介绍下框架基本流程   (web > webservice  【前端架构】 ) > (nodejs 【 数据中转站 】) >(api 【后台接口】)

--web (html  angular 框架)

--webservice(angular 中 编写的service文件 ,在此处原本可以使用 【ng2-file-upload】插件 文件+参数 合并提交,但是在我的项目中  请求需要统一提交,所以在此处 使用第三方插件不太适用

所以自己编写了XMLHttpRequest 进行 form data 合并提交, angular http post 是不可以的,所以使用了 XMLHttpRequest)

--nodejs (nodejs 做 webserver,从浏览器上传文件到后端服务器,nodejs 层只是做一个数据中转+参数加密 == ,nodejs 需)

--api ( 这个就简单介绍一下, php java .net nodejs  == 都是可以得   只是统一好请求参数和 出入参数就ok)

》》》》本次参考文章有以下(可能angular2 目前国内使用不是特别熟练,在国内搜索答案找不到,只好硬着头皮FQ看英文【英语不好只能用翻译软件了 :(  】)

github stack overflow

https://github.com/asafdav/ng-csv

https://stackoverflow.com/questions/37174759/how-do-you-post-a-formdata-object-in-angular-2

https://stackoverflow.com/questions/36352405/file-upload-with-angular2-to-rest-api

https://stackoverflow.com/questions/32423348/angular-post-uploaded-file

本篇文章 主要介绍 前端 (web > webservice  【前端架构】 ) 数据合并提交,下篇文章主要介绍 后端 数据合并提交

1.  component

-----1.   html  编写

 <input type="file" (change)="filechange($event)" />

-----2. ts

import { Component, OnInit } from ‘@angular/core‘;
import { Router } from "@angular/router";
//引入 公共 service提交
import { ApiService, EditAlbumParam } from "app/service/api.service";

@Component({
  selector: ‘app-albumEdit‘,
  templateUrl: ‘./albumEdit.component.html‘,
  styleUrls: [‘./albumEdit.component.css‘]
})
export class AlbumEditComponent implements OnInit {

  private albumTypeData;
  private file: File[];
  private editAlbumParam: EditAlbumParam = new EditAlbumParam();
  constructor(
    private api: ApiService,
    private router: Router) { }

  ngOnInit() {

  }
  //主要实现方法  当文件修改时 接受一下
  filechange(event) {
    this.file = event.srcElement.files;
  }
  //提交事件
  submit() {
    //将参数和文件统一提交
    this.api.editAlbum(this.editAlbumParam, this.file).subscribe(res => {
      if (res.State == 0) {
        alert("添加成功!");
      }
    });
  }
}

2. api.service.ts (所有component 进行 api 请求的必进之路)

import { Injectable } from ‘@angular/core‘;
import { Http, Headers, RequestOptions } from "@angular/http";
import { Observable } from "rxjs/Rx";
import "rxjs/Rx";
import { UploadService } from "app/service/upload.service";
@Injectable()
export class ApiService {

    constructor(private http: Http, private upload: UploadService) { }

    private post(data: ParamData): Observable<ResponseInfo> {
        let host = "/serverH5";
        let bodyObj = {
            cmd: data.cmd,
            param: JSON.stringify(data.param)
        };
        let body = `cmd=${data.cmd}&param=${JSON.stringify(data.param)}`;
        console.log("send infomation : " + body);
     //当发现文件流时  进行 form data 合并提交  调用公用upload service
        if (data.file) {
            return this.upload.makeFileRequest(host, bodyObj, data.file).map(res => res as ResponseInfo)
                .filter((res: ResponseInfo) => {
                    console.log(res);
                    if (res.State == 1) {
                        alert(res.Msg);
                    }
                    return res.State == 0;
                });
        } else {
            let myHeaders = new Headers();
            myHeaders.append(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);
            return this.http.post(
                host,
                body,
                { headers: myHeaders }
            )
                .map(res => res.json() as ResponseInfo)
                .filter((res: ResponseInfo) => {
                    console.log(res);
                    if (res.State == 1) {
                        alert(res.Msg);
                    }
                    return res.State == 0;
                });
        }
    }

    //登录
    login(param: LoginParam) {
        return this.post(new ParamData("LoginBySms", param));
    }
    //发送验证码
    sendCode(param: LoginParam) {
        return this.post(new ParamData("SmsULogin", param));
    }
    //获取专辑类型
    getAlbumType() {
        return this.post(new ParamData("AlbumType", {}));
    }
    //获取专辑列表
    getAlbumList(param: AlbumListParam) {
        return this.post(new ParamData("MyAlbumList", param));
    }
    //添加修改专辑
    editAlbum(param: EditAlbumParam, file?: File[]) {
        return this.post(new ParamData("UserAddAlbum", param, file));
    }
}
export class ParamData {
    /**
     *
     */
    constructor(
        public cmd: string,
        public param: object,
        public file?: File[]
    ) {
    }
}
export class ResponseInfo {
    /**
    *
    */
    constructor(
        public State?: number,
        public Msg?: string,
        public Value?: any
    ) {
    }
}
export class LoginParam {
    public Phone?: number;
    public Code?: number;
}
export class AlbumListParam {
    public PageIndex: number;
    public PageSize: number;
    public Guid: string;
    public CType?: string;
}
export class EditAlbumParam {
    public Name: string;
    public Guid: string;
    public Introduce: string;
    public Id: number;
    public Price: string;
    public CTypeId: string;
    public RId: number;
    public RType: number;
}

3.  upload service.ts  编写

import { Injectable } from ‘@angular/core‘;
import { Observable } from ‘rxjs/Rx‘;
import ‘rxjs/add/operator/share‘;
@Injectable()
export class UploadService {
    [x: string]: any;
    constructor() {
        this.progress$ = Observable.create(observer => {
            this.progressObserver = observer
        }).share();
    }

    public makeFileRequest(url: string, postData: any, files: File[]): Observable<Response> {
        return Observable.create(observer => {
            let formData: FormData = new FormData(),
                xhr: XMLHttpRequest = new XMLHttpRequest();
            //formData 文件流追加
            for (let i = 0; i < files.length; i++) {
                formData.append("uploads[]", files[i], files[i].name);
            }
            //formData 参数追加
            if (postData !== "" && postData !== undefined && postData !== null) {
                for (var property in postData) {
                    if (postData.hasOwnProperty(property)) {
                        formData.append(property, postData[property]);
                    }
                }
            }

            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        observer.next(xhr.response);
                        observer.complete();
                    } else {
                        observer.error(xhr.response);
                    }
                }
            };

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

下篇文章主要介绍 后端 数据合并提交

如有写的不对的地方,请指出,并建议,谢谢 :)

时间: 2024-10-09 23:12:30

angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)的相关文章

JMeter 压力测试使用函数和 CSV 文件参数化 json 数据

在 http Load Testing 中,json 数据的提交是个让人头疼的问题.本文详细介绍如何进行 JMeter 的 json 测试提交,以及如何将其参数化.        Step 1 http json 请求采样器的录制        这个工具很多,可以使用 JMeter 代理录制,也可以使用 Badboy.该采样器录制好以后如下图所示:        Step 2 为该采样器添加 HTTP 信息管理器        鼠标右击该采样器,右键菜单选择 "添加" -> 配置

响应json数据之发送ajax的请求

一.前端异步请求代码: <span style="font-size:14px;">$.ajax ({ type: "POST", //请求的方式 url: "outputservlet3", //请求url data: {}, //前端向后端传送的数据 dataType: "json", //数据格式json error: function () //请求错误的回调函数 { }, success: functio

ashx文件结合ajax使用(返回json数据)

ashx文件返回json数据: public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string userName = string.Empty; string msg = "{{\"code\":\"{0}\",\"msg\":\"{1}\"}}";

Jmeter使用csv参数化Json数据

参考:JMeter 压力测试使用函数和 CSV 文件参数化 json 数据http://blog.csdn.net/defonds/article/details/40824011 结合自己的实践经验重新整理

Android解析中国天气网的Json数据

在Android开发中.一般的APP都是通过获取server端的数据来更新UI.从server获取到的数据能够是Json.它的数据量要比XML要小,这里解析中国天气网上获取的数据,尽管已经不再更新了.但用来学习还是能够的.为了方便我直接到数据通过txt保存到本地,它的数据能够通过这个页面获取:http://m.weather.com.cn/data/101280601.html 文件夹结构 事实上解析也非常easy.关键代码 private void json3() { InputStream

JSON数据之使用Fastjson进行解析(一)

据说FastJson是目前最快的解析Json数据的库,而且是国人开发出来的开源库.顶一下,付上官方网址:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2424946 要使用Fastjson,首先需要下载相对应的jar文件,在官网即可下载.附上初学的第一个例子,多多指教: { "statuses":[ { "id": 912345678901, "text": "

通过Gson解析Json数据

Json是一种数据格式,便于数据传输.存储.交换:Gson是一种组件库,可以把java对象数据转换成json数据格式. gson.jar的下载地址:http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22gson%22 一.Json数据样式 为了便于理解我们先来看看Json的数据样式: 1. 单个数据对象 { "id": 100, "body": "It is my post", "numbe

Spring MVC如何进行JSON数据的传输与接受

本篇文章写给刚接触SpingMVC的同道中人,虽然笔者本身水平也不高,但聊胜于无吧,希望可以给某些人带来帮助 笔者同时再次说明,运行本例时,需注意一些配置文件和网页脚本的路径,因为笔者的文件路径与读者的未必相同 首先准备以下 jar包:commons-logging-1.1.3.jarjackson-core-asl-1.9.2.jarjackson-mapper-asl-1.9.2.jarspring-aop-4.0.6.RELEASE.jarspring-beans-4.0.6.RELEAS

Android:使用Gson解析复杂的JSON数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前广泛使用.本文主要讲解android如何解析复杂格式的JSON数据,适合android初学者和初步接触JSON的人. 1.JSON相关介绍: 首先了解一下JSON的相关内容,JSON中的数据是以键值对的形式出现的.例如"name":"jack":这就是一个键值对,可以理解为name=jack.JSON中很重要的两个概念就是数组(array)和对象(object),初学者