写的很慢,不知不觉这是第十篇了。但是我其他事情太多,只能抽空写下。现在angular4或angular2流行的上传方式是ng2-file-upload。它的功能很强大。但是我没有配置成可以跨域上传的。好像是不支持跨域上传,不知道对错。jquery的插件 jQuery File Upload 可以跨域上传。但是想在angular4内使用jquery插件。需要找到全局jquery对象。也是很麻烦。所以这里就自己实现一个可跨域上传的功能。

demo整体设计有三个站点,第一个是纯前台的,提供对html,js,各种资源的web访问支持就可以。可以用iis,apache,nginx 来支撑。第二个是纯后台的用来提供restful接口服务,这里用tomcat。第三个是资源站点。提供对用户上传的种种文件的访问,可以用iis,apache,nginx 。这里三个站点详细的url是:

①前台   http://121.42.203.123

  ②后台   http://121.42.203.123:8080

③资源站点  http://121.42.203.123:83

图片上传的流程是在前台站点上传文件,传递给后台站点的接口。后台站点把文件写到资源站点上。框架内图片上传是可以和表单上传混合在一起的。就是在一个post或put内,同时传递上传文件和表单数据。但是这样,上传功能就是和具体业务关联在一起。我们需要的通用性就丢失了。所以我的思路是父类组件内有一个文本框后面接一个按钮。点击按钮弹出子组件一个小窗口。在小窗口内上传文件。然后把远程的文件路径返回给父组件,传递到文本框内。做了两个例子。一个是添加或修改用户信息时。选取用户头像图片的。

   

还有一个是专门用来展示上传操作demo的

上传文件组件html代码如下,比较简陋,也没有预览功能。以后在扩展吧。

<template #templateUploadFile>
<div class="modal-header" style="background:#EAEAEA;">
<h5 class="modal-title pull-left">
<b>文件上传</b>
</h5>
<button type="button" class="close pull-right" aria-label="Close" (click)="closeModal()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form #form="ngForm" enctype="multipart/form-data" novalidate>
<input type="file" id="sef" name="sef" class="form-control" ngModel (change)="onSelectChange($event)">
<div *ngIf="this.isError==true" style="color:red">{{this.stringError}}</div>
</form>
</div>
</template>

  对应后台代码如下

 import { Component, OnInit, Input, Inject, ViewChild, TemplateRef, ElementRef, Output, EventEmitter } from '@angular/core';
import { BsModalService } from 'ngx-bootstrap/modal';
import { BsModalRef } from 'ngx-bootstrap/modal/modal-options.class'; import { FileUploader, FileUploaderOptions } from 'ng2-file-upload';
import ConstantsList from '../../common/constants/config';
import { BackCode } from '../../module/common/common';
import { UserNews } from '../../module/business/login'; @Component({
selector: 'app-uploadfile',
templateUrl: './uploadfile.component.html',
styleUrls: ['./uploadfile.component.css']
})
export class UploadfileComponent implements OnInit { @ViewChild('templateUploadFile') public template: TemplateRef<any>;
modalRef: BsModalRef;
ModalConfig = { animated: false, keyboard: false, backdrop: true, ignoreBackdropClick: true, };
@Input() public userNews: UserNews;
@Output() weburl: EventEmitter<string> = new EventEmitter<string>();
isError:boolean = false;
stringError:string; constructor(private modalService: BsModalService, @Inject('public_service') private publicservice: any) { } ngOnInit() { } openModal(template: TemplateRef<any>) {
this.modalRef = this.modalService.show(template, Object.assign({}, this.ModalConfig, { class: 'modal-sm' }));
} closeModal() {
this.modalRef.hide();
this.modalRef = null;
this.stringError = '';
this.isError = false;
} public show() {
this.openModal(this.template);
this.stringError = '';
this.isError = false;
} onSelectChange(event: EventTarget) {
let eventObj: MSInputMethodContext = <MSInputMethodContext>event;
let target: HTMLInputElement = <HTMLInputElement>eventObj.target;
let files: FileList = target.files;
let file: File = files[]; if(this.checkIsImage(file.name) == true) {
this.isError = false;
this.stringError = '';
let postData = null;
let sendtoken: string = this.userNews.id + '-' + this.userNews.token + '-' + ConstantsList.runid; this.publicservice.postWithFile1(sendtoken, postData, files).then(ub => {
let bc: BackCode = ub as BackCode;
this.weburl.emit(ConstantsList.HOSTPIC + bc.id);
});
}
else{
this.isError = true;
this.stringError = '请确定文件格式为 jpg png jpeg bmp gif';
}
} checkIsImage(filename: string): boolean {
let filenameend:string = '|' + filename.slice(filename.lastIndexOf('.') + ) + '|';
if ('|jpg|png|jpeg|bmp|gif|'.indexOf(filenameend.toLowerCase()) !== -) {
return true;
} else {
return false;
}
} }

服务端ssm框架内,接收post的地方关键就是要添加下面几个信息。

  response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type,Access-Token");

 其他的接收文件。写文件网上都很多例子。这里用自定义的http头信息进行校验。防止其他路径上非法的post上传文件。但是不是绝对的。这里展示一下这个功能。

demo演示地址是  http://121.42.203.123

Angular4 后台管理系统搭建(10) - 做一个通用的可跨域上传文件的组件的更多相关文章

  1. Angular4 后台管理系统搭建(1) - 建立一个通用的Wijmo5 flexgrid分页器组件

    17年4月,开始学习angular2,到5月跟着升级到angular4.目前还在学习,搭建中.我的最终目的是用angular4框架搭建一个后台管理系统.这里使用了三个关键的外部库. 1.使用admin ...

  2. Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证

    最近这段时间发现,北京这用angular4 或 angular2的公司很少.几乎是没有.很担心自己是不是把精力放到了不应该的地方.白耽误了时间.但是随着我对新版angular框架理解的加深.个人感觉a ...

  3. 后台使用Spring MVC 4.15 版本 通过 ajaxFileUpload plugin插件上传文件相应时引起的一个小问题,Chrome、Firefox中出现SyntaxError:unexpected token <

    html: 使用ajaxFileUpload插件做文件上传时,后台返回json格式的数据,js代码如下: 接下来,把结果错误信息打印出来: 先在网上找了下解决办法方案,stackoverflow上有说 ...

  4. 手把手教你实现一个通用的jsonp跨域方法

    什么是jsonp JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1 ...

  5. Angular4 后台管理系统搭建(2) - flexgrid 单元格模板 wjFlexGridCellTemplate 的坑

    这几天中了很多坑,尤其是两个大坑.先是运行环境的坑,在是flexgrid单元格内部模板的坑.这里记录下. 一开始我遇见一些很奇怪的问题,按网上的说法,别人这么写代码都正常,就在我机器上不正常.按以前的 ...

  6. 如何实现一个通用的IHttpHandler 万能的IHttpHandler HttpWebRequest文件上传

    昨天遇到一个比较奇怪的需求,大致是需要在服务器上部署一个http服务,但是服务的具体功能不知道,以后在客服端实现.这里介绍一下系统背景,有一个系统运(部署在美国)行了很多年了,给系统产生了很多文件,现 ...

  7. 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传

    使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址  ...

  8. Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端

    要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...

  9. java 附件上传时后台验证上传文件的合法性

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

随机推荐

  1. Alpha 版本测试和发布说明

    Alpha版本测试报告 一bug汇总 做题时答案是错的.(已修复) 每次生成的题目一样(已经修复) 计时没有显示即倒计时,难度不同的功能没有实现(打算修复) 没有导入试卷和错题功能(不打算修复) 二. ...

  2. 201521123117 《Java程序设计》第3周学习总结

    1. 本周学习总结: 2. 书面作业 Q1:代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  3. 201521123069 《Java程序设计》第1周学习总结

    1. 本章学习总结 Java语言的发展.特点(面向对象.简单性.平台无关性) 认识并区分JVM(Java虚拟机),JRE(Java执行环境),JDK(Java开发工具包) 安装好JDK,设置Path变 ...

  4. 201521123119《Java程序设计》第1周学习总结

    1.本周学习总结    1.Java语言是一种多用途的语言.并发的语言.以类为基础,面向对象的语言. 2.Java比C++更加方便,有辅助输入,编写速度大大加快. 3.Java根据应用领域不同,区分为 ...

  5. 201521123033《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  6. Mybatis第一篇【介绍、快速入门、工作流程】

    什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  7. Linux 文件系统的组织方式

    在linux中,一切都看成文件,不管是目录还是设备.所以想要熟练使用Linux,那么对文件的本质和组织结构要有一定的认识. linux系统下使用的设备不用像windows系统下一样创建驱动器磁盘符.l ...

  8. CacheConcurrencyStrategy五种缓存方式

    CacheConcurrencyStrategy有五种缓存方式:  CacheConcurrencyStrategy.NONE,不适用,默认  CacheConcurrencyStrategy.REA ...

  9. GCD之after

    先介绍下C中的modf函数 函数名:modf 头文件:<math.h> 函数原型:double modf(double x, double *ipart) 函数用途:分解x,以得到x的整数 ...

  10. AngularJS -- 指令(创建自定义指令)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/   什么是指令 注:本指南是针对已经熟悉AngularJS基础知识的开发人员.如果你才刚 ...