form+iframe解决跨域上传文件的方法

(1)  jsp代码:

<form id="form" name="form" enctype="multipart/form-data" method="post" target="hidden_frame">
	<table style="border:0;width:100%;text-align:middle;">
		<tr style="border:0;height:20px;width:100%;">
			<td style="border:0;width:75px;height:20px;line-height:20px;">控件标识</td>
			<td>
				<input id="viewkey" name="viewkey" style="width:200px;" type="text" maxlength="300" placeholder="控件标识不能超过30个字。" class="easyui-validatebox" onkeyup="check()" required="true" missingMessage="参数名称不可为空."/>
			</td>
		</tr>
		<tr>
			<td>更新类型</td>
			<td><input id="type" name="type" class="easyui-combobox" valueField="id" textField="text" panelHeight="auto"/></td>
		</tr>
		<tr>
			<td>备注</td>
			<td colspan=3>
						<textarea id="remark" name="remark" onkeyup="check()" placeholder="备注不能超过300个字。" style="width:200px;height:80px;" ></textarea>
			</td>
		</tr>
		<tr>
			<td>资源文件:</td>
			<td >
				<input type="file" id="file" name="file" style="height:25px; width:200px;" onchange="fileChange(this);">
				<input type="hidden" name="projectid" id="projectid" >
				<input type="hidden" name="downimageconfigid" id="downimageconfigid" >
				<input type="hidden" name="iskeychange" id="iskeychange" >
				<input type="hidden" name="isnopic" id="isnopic" >
				<iframe name="hidden_frame" id="hidden_frame" style="display:none"></iframe>
			</td>
		</tr>
		<tr>
			<td></td>
			<td><div style="color: red; margin-top: 10px;">图片大小必须小于500K。</div></td>
		</tr>
	</table>
</form>

说明:form中的target指向iframe中的name。这点要注意。

(2)  js代码:

//添加对话框
function initDialog(){
	$('#imgconf-dialog').dialog({
		modal:true,
		closable:false,
		top: 20,
		buttons:[{
			id:'ut_add',
			text:'确定',
			iconCls:'icon-ok',
			handler:function(){
				//表单注册事件
				$('#form').form({
					success:function(data){//提交成功后的回调函数
						if(data === '00'){
							jqueryAlert('操作成功');
						}
						if(data === '03'){
							$.messager.alert(global.title,'主键为空!','warning');
							$('#ut_add').linkbutton('enable');
							return;
						}
						if(data === '02'){
							$.messager.alert(global.title,'已存在的控件标识!','warning');
							$('#ut_add').linkbutton('enable');
							return;
						}
						if(data === '01'){
							$.messager.alert(global.title,'操作失败','warning');
							$('#ut_add').linkbutton('enable');
							return;
						}
						$('#imgconf-dialog').dialog('close');
						//重新加载列表
						getDataGridData();;
				  }
				});

				$('#ut_add').linkbutton('disable');

				//【添加】
				if(global.operatype == 'add'){
					if($('#viewkey').val() == null || $('#viewkey').val() == ''){
						$.messager.alert(global.title,'您尚未输入控件标识!','warning');
						$('#ut_add').linkbutton('enable');
						return;
					}
					if($('#file').val() == ''){
						$.messager.alert(global.title,'您尚未上传图片!!','warning');
						$('#ut_add').linkbutton('enable');
						return;
					}

					//表单上传操作
					$('#projectid').val(global.projectid);
					$('#form').attr("action", global.web_path + "/grid/imgconf/addimgconf.do");
					$("#form").submit();
					$('#ut_add').linkbutton('disable');
				} else {//【编辑】
					//控件标识是否改变
					var iskeychange;
					if(selected.viewkey == $('#viewkey').val()){//控件标识没有改变
						iskeychange = 'no';
					}else{
						iskeychange = 'yes';
					}
					var isnopic;
					if($('#file').val() == ''){//是否有上传图片
						snopic = 'yes';
					}else{
						isnopic = 'no';
					}

					//表单上传操作
					$('#projectid').val(global.projectid);
					$('#downimageconfigid').val(selected.downimageconfigid);
					$('#iskeychange').val(iskeychange);
					$('#isnopic').val(isnopic);
					$('#form').attr("action",global.web_path + "/grid/imgconf/modimgconf.do");
					$("#form").submit(); ;
					$('#ut_add').linkbutton('disable');
				}
			}
			},{
				id:'ut_close',
				text:'退出',
				handler:function(){
					$('#ut_add').linkbutton('enable');
					$('#imgconf-dialog').dialog('close');
					$('#uploadify').uploadifyClearQueue();
				}
			}]
	});
}

//重置
function reset(){
	$('#ut_add').linkbutton('enable');
	var target = $('#file');
	if(global.operatype == 'mod'){
		$('#imgconf-dialog').dialog('setTitle','修改');
		$('#viewkey').val(selected.viewkey);
		$('#type').combobox('setValue', selected.type);
		$('#remark').val(selected.remark);
		$('#imgconf-dialog').dialog('open');
		//文件上传清空
		deleteFile('file');
	}else {
		$('#imgconf-dialog').dialog('setTitle','添加');
		$('#viewkey').val('');
		$('#remark').val('');

		//文件上传清空
		deleteFile('file');
	}
}

/**
 * 文本区域限制长度
 */
function check(){
	var content = $('#remark').val();
	len = content.length;
	var maxlen = 300;
	if(len > maxlen){
		alert("字数太长,已被截断为300字!");
		$('#remark').val(content.substr(0,maxlen));
	}
}

// input type='file'置位操作
function deleteFile(file){
 var ie = (navigator.appVersion.indexOf("MSIE")!=-1);//IE
 var ff = (navigator.userAgent.indexOf("Firefox")!=-1);//Firefox
 if(ie){
	refreshUploader($("input[name="+file+"]")[0]);
 }
 else{
	$("input[name="+file+"]").attr("value","");
 }
}
function refreshUploader(file){
  var file2= file.cloneNode(false);
  file2.onchange= file.onchange;
  file.parentNode.replaceChild(file2,file);
}

//检测文件大小和类型
function fileChange(target){
//检测上传文件的类型
if(!(/(?:jpg|gif|png|jpeg)$/i.test(target.value))) {
    alert("只允许上传jpg|gif|png|jpeg格式的图片");
    if(window.ActiveXObject) {//for IE
    target.select();//select the file ,and clear selection
      document.selection.clear();
    } else if(window.opera) {//for opera
    target.type="text";target.type="file";
    } else target.value="";//for FF,Chrome,Safari
    return;
  } else {
  return; //alert("ok");//or you can do nothing here.
  }

//检测上传文件的大小
  var isIE = /msie/i.test(navigator.userAgent) && !window.opera;
  var fileSize = 0;
  if (isIE && !target.files){
    var filePath = target.value;
    var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
    var file = fileSystem.GetFile (filePath);
    fileSize = file.Size;
  } else {
    fileSize = target.files[0].size;
  }
  var size = fileSize / 1024;
  if(size>(500)){
  alert("文件大小不能超过500KB");
  if(window.ActiveXObject) {//for IE
    target.select();//select the file ,and clear selection
      document.selection.clear();
    } else if(window.opera) {//for opera
    target.type="text";target.type="file";
    } else {
    target.value="";//for FF,Chrome,Safari
    }
  return;
  }else{
  return;
  }
}

(3) 后台java代码:

/**
* 添加下载图片配置
* @throws IOException
*/
@RequestMapping(value = "/grid/imgconf/addimgconf",method = {RequestMethod.POST, RequestMethod.GET},produces = {"text/html;charset=UTF-8"})
@ResponseBody
public String addImgConf(HttpServletRequest
 request, HttpServletResponse response, BindException errors) throws IOException{
String m = "00";
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
response.setHeader("Access-Control-Allow-Origin", "*");
String projectid = Function.dealNull(multipartRequest.getParameter("projectid"));
String viewKey = Function.dealNull(multipartRequest.getParameter("viewkey"));
String type = Function.dealNull(multipartRequest.getParameter("type"));
String remark = Function.dealNull(multipartRequest.getParameter("remark"));
try {
//唯一性判断
int size = imgConfService.getImgConfsCount(Constants.DEF_STRING_NULL, projectid, viewKey, Constants.STATUS_ON);
if(size > 0){
m = "02";
logger.info("已存在的控件标识!");
return "<textarea>" + m + "</textarea>";
}
//上传图片
  Map<String, String> picInfo = imgConfService.uploadImage(fileMap);
imgConfService.addImgConf(UUID.randomUUID().toString(), projectid, viewKey, type, remark, picInfo.get("URL"), Constants.STATUS_ON);
m = "00";
logger.info("添加下载图片配置成功!");
} catch (Exception e) {
m = "01";
logger.error("添加下载图片配置失败" ,e);
}

//加<textarea>以解决IE下submit后没有执行回调success函数,这个是jquery easyui form的bug
return "<textarea>" + m + "</textarea>";
}

说明:"<textarea>" + m + "</textarea>";和produces = {"text/html;charset=UTF-8"}解决IE下不能执行回调函数success的问题

以上这篇form+iframe解决跨域上传文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解React-Todos入门例子

    最近学完React的最基本概念,闲下来的时候就自己写了一个Todo-List的小应用.这里做个简略的说明,给想好好学React的新手看. 开始之前 这里我用了webpackb做了babel和JSX预处理和模块打包.所以对React和一些ES2015(ES6)的语法要有一定的了解.我相信学习ES2015绝对是划算的,因为它是Js的规范.这里给出学习的地方,阮一峰老师的ECMAScript 6 入门或者babel的相关文档Learn ES2015. 最后的实际效果: 我们需要做到的功能有: 可以在最

  • javascript使用window.name解决跨域问题第1/2页

    window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制.数据只能是字符串.设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:<Session variables without cookies>),后来 Kris Zyp 在此方法的基础上强化了 window.name 传输 ,并引入到了 Dojo(dojox.io.windowName),用来解决跨域数据传输问题.window.name 传输技

  • js前端解决跨域问题的8种方案(最新最全)

    1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许 http://www.a.com/a.js https://www.a.com/b

  • 用jQuery与JSONP轻松解决跨域访问的问题

    时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘. 跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient方式完成"跨域访问"的工作,然后在浏览器端用AJAX获取本机服务器端"跨域访问"对应的url.来间接完成跨域访问也是可以的

  • AngularJs解决跨域问题案例详解(简单方法)

    首先我们做点准备说明,不然你明白我说的是啥意思别人不明白,就算别人明白了那总有人不明白,那你要说了,我的意思是这个说明必须要做了,答案是必须的,为了更好的方便大家理解嘛. 我们以两个主域名或者一个主域名+一个二级域名为例,均可演示跨域问题. 客户端 a.com 服务端 b.com或者s.a.com angularJs版本 V1.2.25 准备工作做得很充分嘛,就差把我们的编辑器是subline暴露出来了,这个一般人我是不告诉他滴. 有人嚷嚷了,这问题老早就有了,你现在提出来有啥意义呢?难不成你还

  • 详解基于angular-cli配置代理解决跨域请求问题

    1.跨域请求产生 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻辑,同一份数据接口,我们可以定制开发多个版本. 而前后端分离带来的一个问题就是前端web部署的服务器和后端提供服务的服务器大概率不在同一个域名下,进而会产生跨域问题. 2.通用解决方案 如果浏览器支持HTML5,那么就可以一

  • 使用jsonp完美解决跨域问题

    调用web接口,get请求,发现提示:No 'Access-Control-Allow-Origin' header is present on the requested resource. 这个和安全机制有关,默认不允许跨域调用 处理手段:使用jsonp格式, ajax请求参数dataType:'JSONP'. 复制代码 代码如下: $.ajax({         url: "http://.......",         type: 'GET',         dataTy

  • ASP.NET配合jQuery解决跨域调用的问题

    一. 使用JSONp方式调用 不做详细讲解,可以参考jq文档<jQuery 1.10.3 在线手册> 二. 服务端配置 修改Web.config 文件 <system.webServer> <modules runAllManagedModulesForAllRequests="true"></modules> <httpProtocol> <customHeaders> <add name="Ac

  • 前端跨域的几种解决方式总结(推荐)

    搞大前端的,肯定都会遇到跨域问题的,虽然网上这方面的资料也很多,但我还是喜欢自己写一遍,自己理解过.总结过的东西才记得最深刻. 同源策略 JavaScript 的同源策略,是由Netscape提出的一个著名的安全策略,为了阻止A站的JS去操作别的网站的数据.你想啊,你现在打开了浏览器,在一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这

  • form+iframe解决跨域上传文件的方法

    (1)  jsp代码: <form id="form" name="form" enctype="multipart/form-data" method="post" target="hidden_frame"> <table style="border:0;width:100%;text-align:middle;"> <tr style="bo

  • asp.net中MVC借助Iframe实现无刷新上传文件实例

    本文实例讲述了asp.net中MVC借助Iframe实现无刷新上传文件的方法.分享给大家供大家参考.具体实现方法如下: html: 复制代码 代码如下: <div id="uploadwindow" style="display: none;">     <form action="/ShopActivitys/ImportActivityItems" id="form1" name="form1&

  • SpringMVC跨服务器上传文件中出现405错误的解决

    目录 SpringMVC跨服务器上传文件中出现405错误 重点来了~ SpringMVC跨服务器上传文件中出现405错误 下面是 应用服务器 的代码 package com.itheima.controller; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import org.apache.commons.fileupload.FileItem; import or

  • 通过隐藏iframe实现无刷新上传文件操作

    其实在ajax出现之前,web应用也可以是无刷新的,那时大多通过IFrame来做到这一点.当然Ajax出现之后,人们一窝蜂地投奔Ajax 的阵营了,iFrame 就乏人问津了.但是用iFrame来实现无刷新上传文件确实一个很好的选择. 解决办法是通过一个隐藏的iframe来处理上传操作我采用的是ReactJS,amazeui,nodejs 1.html target指向iframe的name,就是把上传后的操作交给iframe来处理. <form id="supplyformFile&qu

  • SpringBoot 如何优雅的实现跨服务器上传文件的示例

    项目完整代码链接:代码链接 跨服务上传文件示意图 一.创建项目 springboot:2.2.6 JDK:1.8 由于资源有限,就用不同端口表示不同服务器了. 1.1 上传文件的项目 首先idea快速搭建工具创建一个springboot项目,名字为fileupload,作为上传文件的服务端. 选择spring web模块即可 配置相关参数 spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=30

  • java使用webuploader实现跨域上传详解

    前言 项目中使用webuploader进行文件上传,需要用到跨域,查看webuploader的issues发现是支持上传的,但是他们写的回复都是不清不白的,有点迷糊:想了半天才知道咋回事,也可能是我比较笨,再次记录下java中详细的处理. webuploader进行上传,会执行2个请求:一个option请求,一个post(根据你的webuploader的配置method 值决定),需要在option请求中对响应头进行处理,post响应头也进行响应的处理. 以servlet为例: @WebServ

  • C#实现图片上传(PC端和APP)保存及 跨域上传说明

    A-PC端: 1-页面--multiple是控制单张还是多张图片上传 <input id="BusRoute" type="file" class="btn btn-default btn-lg" style="height:34px;padding-top:5px;padding-bottom:5px;" multiple /> 2-后台获取图片文件: HttpFileCollection pcFileColl

  • Android 解决WebView无法上传文件的问题

    Android 解决WebView无法上传文件的问题 Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法.于是我把工作中的相关代码记录下来.下次直接拿来用就行了.一点一滴都是经验. 1.需要定义三个变量 private ValueCallback<Uri[]> uploadMessageAboveL; private final static int FILE_CHOOSER_RESULT_CODE = 10000; private ValueCallback<

  • 解决asp.net上传文件超过了最大请求长度的问题

    错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 解决方案 1. 修改web.config文件可以改变这个默认值 <configuration> <system.web> <httpRuntime maxRequestLength="1048576" executionTimeout="3600" /> </system.web> <configuratio

  • 解决Ajax方式上传文件报错"Uncaught TypeError: Illegal invocation"

    今天使用ajax上传文件时,出现了错误.数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求.F12看到后台报了个错误:Uncaught TypeError: Illegal invocation,百度了一下,找到了解决方法. 解决方法:在ajax请求的参数中添加如下两个参数: $.ajax({ ..., processData: false, contentType: false, ... }); processData 类型:Boolean

随机推荐