angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)
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 编写
- <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}¶m=${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);
- });
- }
- }
下篇文章主要介绍 后端 数据合并提交
如有写的不对的地方,请指出,并建议,谢谢 :)
angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)的更多相关文章
- angular2^ typescript 将 文件和Json数据 合并发送到服务器(2.服务端)
nodejs 中使用框架 express web框架 multer 文件接受 直接贴代码了,我就不解释了 "use strict"; exports.__esModule = tr ...
- Newtonsoft.Json读取txt文件中json数据并存到SQL service 数据库!
using System; using System.Collections.Generic; using System.Text; using System.IO; using Newtonsoft ...
- 关于引用JS和CSS文件刷新浏览器缓存问题,部署服务器后客户端样式不刷新
问题描述 对样式的css文件进行了修改,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...
- Python 编程快速上手 第十四章 处理 CSV 文件和 JSON 数据
前言 这一章分为两个部分,处理 CSV 格式的数据和处理 JSON 格式个数据. 处理 CSV 理解 csv csv 的每一行代表了电子表格中的每一行,每个逗号分开两个单元格csv 的内容全部为文本, ...
- 游标、获取本地本地多个文件、Excel数据导入、跨服务器数据拷贝、行转列示例
)='C:\Users\Administrator\Desktop\待处理数据\顺江学校4\' ---------------------------------------------------- ...
- 响应json数据之发送ajax的请求
一.前端异步请求代码: <span style="font-size:14px;">$.ajax ({ type: "POST", //请求的方式 ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_7 响应json数据之发送ajax的请求
编写conroller的方法 @RequestBody获取请求体的内容.当前请求体传递的是json字符串. 拿到了请求的内容
- 用java在客户端读取mongodb中的数据并发送至服务器
使用Java自带的socket端口来实现,程序如下: Client.java package com.cn.gao; import java.net.*; import java.io.*; impo ...
- 利用jQuery中的serialize方法大量获取页面中表单的数据,发送的服务器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
随机推荐
- Git学习(2)-使用Git 代码将本地文件提交到 GitHub
上次随笔写到git的安装和运用命令窗口创建本地版本库,这次主要讲一下用git代码将本地文件提交到GitHub上. 前提是有一个GitHub账号. 1.创建一个新的版本库,进入到你本地项目的根目录下(我 ...
- UML图学习之三 状态图
状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action). ...
- spring data jpa 学习笔记
springboot 集成 springData Jpa 1.在pom.xml添加依赖 <!-- SpringData-Jpa依赖--> <dependency <groupI ...
- FormsAuthentication.HashPasswordForStoringInConfigFile 的替代方法
由于项目中要和php对接,要将一段字符串生成md5(16位)验证码,在英文字符时,没有太大问题,但在遇到中文时,两边字条始终不一致. php是别人的项目,看不到源码,网上一查,估计是这样写的: < ...
- java事件处理机制
java中的事件机制的参与者有3种角色: 1.event object:就是事件产生时具体的"事件",用于listener的相应的方法之中,作为参数,一般存在与listerne ...
- 优秀的基于VUE移动端UI框架合集
1. vonic 一个基于 vue.js 和 ionic 样式的 UI 框架,用于快速构建移动端单页应用,很简约,是我喜欢的风格 star 2.3k 中文文档 在线预览 2.vux 基于WeUI和Vu ...
- Linux下passwd和shadow文件内容详解
一./etc/passwd /etc/passwd 文件是一个纯文本文件,每行采用了相同的格式: name:password:uid:gid:comment:home:shell name 用户登录名 ...
- 【转】linux shell ${}简单用法
为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能: 假设我们定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt 我们可以用 ${ } 分别替换获得不 ...
- matlab判断文件或文件夹是否存在
当前目录中包含以下文件及文件夹: startup.m win64/ … 判断当前目录中是否存在startup.m文件 if ~exist('startup.m','file')==0 error ...
- 跳转语句Break、continue
跳转语句Break.continue 1.break -跳出 作用范围:switch或循环语句; -当break语句单独存在时,下面不需要定义其他语句,因为直接被跳出,不执行下面的语句. -break ...