git地址 https://gitee.com/richard1015/AnchorSys/tree/master/src/app/service

首先介绍下框架基本流程   (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 目前国内使用不是特别熟练,在国内搜索答案找不到,只好硬着头皮翻墙看英文【英语不好只能用翻译软件了 :(  】)

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  编写

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

-----2. ts

  1. import { Component, OnInit } from '@angular/core';
  2. import { Router } from "@angular/router";
  3. //引入 公共 service提交
  4. import { ApiService, EditAlbumParam } from "app/service/api.service";
  5.  
  6. @Component({
  7. selector: 'app-albumEdit',
  8. templateUrl: './albumEdit.component.html',
  9. styleUrls: ['./albumEdit.component.css']
  10. })
  11. export class AlbumEditComponent implements OnInit {
  12.  
  13. private albumTypeData;
  14. private file: File[];
  15. private editAlbumParam: EditAlbumParam = new EditAlbumParam();
  16. constructor(
  17. private api: ApiService,
  18. private router: Router) { }
  19.  
  20. ngOnInit() {
  21.  
  22. }
  23. //主要实现方法 当文件修改时 接受一下
  24. filechange(event) {
  25. this.file = event.srcElement.files;
  26. }
  27. //提交事件
  28. submit() {
  29. //将参数和文件统一提交
  30. this.api.editAlbum(this.editAlbumParam, this.file).subscribe(res => {
  31. if (res.State == 0) {
  32. alert("添加成功!");
  33. }
  34. });
  35. }
  36. }

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

  1. import { Injectable } from '@angular/core';
  2. import { Http, Headers, RequestOptions } from "@angular/http";
  3. import { Observable } from "rxjs/Rx";
  4. import "rxjs/Rx";
  5. import { UploadService } from "app/service/upload.service";
  6. @Injectable()
  7. export class ApiService {
  8.  
  9. constructor(private http: Http, private upload: UploadService) { }
  10.  
  11. private post(data: ParamData): Observable<ResponseInfo> {
  12. let host = "/serverH5";
  13. let bodyObj = {
  14. cmd: data.cmd,
  15. param: JSON.stringify(data.param)
  16. };
  17. let body = `cmd=${data.cmd}&param=${JSON.stringify(data.param)}`;
  18. console.log("send infomation : " + body);
  19.      //当发现文件流时 进行 form data 合并提交 调用公用upload service
  20. if (data.file) {
  21. return this.upload.makeFileRequest(host, bodyObj, data.file).map(res => res as ResponseInfo)
  22. .filter((res: ResponseInfo) => {
  23. console.log(res);
  24. if (res.State == 1) {
  25. alert(res.Msg);
  26. }
  27. return res.State == 0;
  28. });
  29. } else {
  30. let myHeaders = new Headers();
  31. myHeaders.append('Content-Type', 'application/x-www-form-urlencoded');
  32. return this.http.post(
  33. host,
  34. body,
  35. { headers: myHeaders }
  36. )
  37. .map(res => res.json() as ResponseInfo)
  38. .filter((res: ResponseInfo) => {
  39. console.log(res);
  40. if (res.State == 1) {
  41. alert(res.Msg);
  42. }
  43. return res.State == 0;
  44. });
  45. }
  46. }
  47.  
  48. //登录
  49. login(param: LoginParam) {
  50. return this.post(new ParamData("LoginBySms", param));
  51. }
  52. //发送验证码
  53. sendCode(param: LoginParam) {
  54. return this.post(new ParamData("SmsULogin", param));
  55. }
  56. //获取专辑类型
  57. getAlbumType() {
  58. return this.post(new ParamData("AlbumType", {}));
  59. }
  60. //获取专辑列表
  61. getAlbumList(param: AlbumListParam) {
  62. return this.post(new ParamData("MyAlbumList", param));
  63. }
  64. //添加修改专辑
  65. editAlbum(param: EditAlbumParam, file?: File[]) {
  66. return this.post(new ParamData("UserAddAlbum", param, file));
  67. }
  68. }
  69. export class ParamData {
  70. /**
  71. *
  72. */
  73. constructor(
  74. public cmd: string,
  75. public param: object,
  76. public file?: File[]
  77. ) {
  78. }
  79. }
  80. export class ResponseInfo {
  81. /**
  82. *
  83. */
  84. constructor(
  85. public State?: number,
  86. public Msg?: string,
  87. public Value?: any
  88. ) {
  89. }
  90. }
  91. export class LoginParam {
  92. public Phone?: number;
  93. public Code?: number;
  94. }
  95. export class AlbumListParam {
  96. public PageIndex: number;
  97. public PageSize: number;
  98. public Guid: string;
  99. public CType?: string;
  100. }
  101. export class EditAlbumParam {
  102. public Name: string;
  103. public Guid: string;
  104. public Introduce: string;
  105. public Id: number;
  106. public Price: string;
  107. public CTypeId: string;
  108. public RId: number;
  109. public RType: number;
  110. }

3.  upload service.ts  编写

  1. import { Injectable } from '@angular/core';
  2. import { Observable } from 'rxjs/Rx';
  3. import 'rxjs/add/operator/share';
  4. @Injectable()
  5. export class UploadService {
  6. [x: string]: any;
  7. constructor() {
  8. this.progress$ = Observable.create(observer => {
  9. this.progressObserver = observer
  10. }).share();
  11. }
  12.  
  13. public makeFileRequest(url: string, postData: any, files: File[]): Observable<Response> {
  14. return Observable.create(observer => {
  15. let formData: FormData = new FormData(),
  16. xhr: XMLHttpRequest = new XMLHttpRequest();
  17. //formData 文件流追加
  18. for (let i = 0; i < files.length; i++) {
  19. formData.append("uploads[]", files[i], files[i].name);
  20. }
  21. //formData 参数追加
  22. if (postData !== "" && postData !== undefined && postData !== null) {
  23. for (var property in postData) {
  24. if (postData.hasOwnProperty(property)) {
  25. formData.append(property, postData[property]);
  26. }
  27. }
  28. }
  29.  
  30. xhr.onreadystatechange = () => {
  31. if (xhr.readyState === 4) {
  32. if (xhr.status === 200) {
  33. observer.next(xhr.response);
  34. observer.complete();
  35. } else {
  36. observer.error(xhr.response);
  37. }
  38. }
  39. };
  40.  
  41. xhr.upload.onprogress = (event) => {
  42. this.progress = Math.round(event.loaded / event.total * 100);
  43.  
  44. this.progressObserver.next(this.progress);
  45. };
  46.  
  47. xhr.open('POST', url, true);
  48. xhr.send(formData);
  49. });
  50. }
  51. }

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

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

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

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

    nodejs 中使用框架 express web框架 multer 文件接受 直接贴代码了,我就不解释了 "use strict"; exports.__esModule = tr ...

  2. Newtonsoft.Json读取txt文件中json数据并存到SQL service 数据库!

    using System; using System.Collections.Generic; using System.Text; using System.IO; using Newtonsoft ...

  3. 关于引用JS和CSS文件刷新浏览器缓存问题,部署服务器后客户端样式不刷新

    问题描述 对样式的css文件进行了修改,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...

  4. Python 编程快速上手 第十四章 处理 CSV 文件和 JSON 数据

    前言 这一章分为两个部分,处理 CSV 格式的数据和处理 JSON 格式个数据. 处理 CSV 理解 csv csv 的每一行代表了电子表格中的每一行,每个逗号分开两个单元格csv 的内容全部为文本, ...

  5. 游标、获取本地本地多个文件、Excel数据导入、跨服务器数据拷贝、行转列示例

    )='C:\Users\Administrator\Desktop\待处理数据\顺江学校4\' ---------------------------------------------------- ...

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

    一.前端异步请求代码: <span style="font-size:14px;">$.ajax ({ type: "POST", //请求的方式 ...

  7. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_7 响应json数据之发送ajax的请求

    编写conroller的方法 @RequestBody获取请求体的内容.当前请求体传递的是json字符串. 拿到了请求的内容

  8. 用java在客户端读取mongodb中的数据并发送至服务器

    使用Java自带的socket端口来实现,程序如下: Client.java package com.cn.gao; import java.net.*; import java.io.*; impo ...

  9. 利用jQuery中的serialize方法大量获取页面中表单的数据,发送的服务器

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

随机推荐

  1. Git学习(2)-使用Git 代码将本地文件提交到 GitHub

    上次随笔写到git的安装和运用命令窗口创建本地版本库,这次主要讲一下用git代码将本地文件提交到GitHub上. 前提是有一个GitHub账号. 1.创建一个新的版本库,进入到你本地项目的根目录下(我 ...

  2. UML图学习之三 状态图

    状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action). ...

  3. spring data jpa 学习笔记

    springboot 集成 springData Jpa 1.在pom.xml添加依赖 <!-- SpringData-Jpa依赖--> <dependency <groupI ...

  4. FormsAuthentication.HashPasswordForStoringInConfigFile 的替代方法

    由于项目中要和php对接,要将一段字符串生成md5(16位)验证码,在英文字符时,没有太大问题,但在遇到中文时,两边字条始终不一致. php是别人的项目,看不到源码,网上一查,估计是这样写的: < ...

  5. java事件处理机制

    java中的事件机制的参与者有3种角色:   1.event object:就是事件产生时具体的"事件",用于listener的相应的方法之中,作为参数,一般存在与listerne ...

  6. 优秀的基于VUE移动端UI框架合集

    1. vonic 一个基于 vue.js 和 ionic 样式的 UI 框架,用于快速构建移动端单页应用,很简约,是我喜欢的风格 star 2.3k 中文文档 在线预览 2.vux 基于WeUI和Vu ...

  7. Linux下passwd和shadow文件内容详解

    一./etc/passwd /etc/passwd 文件是一个纯文本文件,每行采用了相同的格式: name:password:uid:gid:comment:home:shell name 用户登录名 ...

  8. 【转】linux shell ${}简单用法

    为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能: 假设我们定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt 我们可以用 ${ } 分别替换获得不 ...

  9. matlab判断文件或文件夹是否存在

    当前目录中包含以下文件及文件夹: startup.m win64/ … 判断当前目录中是否存在startup.m文件 if ~exist('startup.m','file')==0    error ...

  10. 跳转语句Break、continue

    跳转语句Break.continue 1.break -跳出 作用范围:switch或循环语句; -当break语句单独存在时,下面不需要定义其他语句,因为直接被跳出,不执行下面的语句. -break ...