Ajax提交表单,带文件上传

文件上传时,使用Ajax提交表单会很方便

public void addGame(HttpServletRequest request, HttpServletResponse response) throws Exception{
		/*
		 * 建立文件工厂(已经确定当前请求时文件上传,否则还需要先判断)
			if(ServletFileUpload.isMultipartContent(request))判断语句,
			如果为false,说明表单只包含文本;反之,表单是多媒体上传
		 */
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//获取当先项目的绝对路径
		String realPath = getServletContext().getRealPath("/");
		//获取文件上传时产生的临时文件目录tmp路径
		String tmp = realPath + "upload\\tmp";
		//创建文件临时存储目录
		factory.setRepository(new File(tmp));
		//获取servlet文件上传对象
		ServletFileUpload upload = new ServletFileUpload(factory);
		//使用文件上传对象获取流及表单字段
		List<FileItem> items = upload.parseRequest(request);
		GameInfo gameInfo = new GameInfo();
		
		String pictures = "";//初始化游戏详情图片上传路径
		//遍历集合对象,将表单数据与上传文件分开处理
		for(FileItem item : items) {
			String fieldName = item.getFieldName();
			String fieldValue = item.getString();
			//对象是表单数据
			if(item.isFormField()) {
				if("gname".equals(fieldName)) {					
						//表单字段有汉字的需要进行处理防止乱码
						gameInfo.setGname(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("gtitle".equals(fieldName)) {											
						gameInfo.setGtitle(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("size".equals(fieldName)) {
					//判断值不为null且不为空字符串
					if(StringUtils.isNotEmpty(fieldValue)) {						
						gameInfo.setSize(Double.parseDouble(fieldValue));
					}
				}
				if("status".equals(fieldName)) {					
						gameInfo.setStatus(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("gameType".equals(fieldName)) {					
						gameInfo.setGameType(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("platform".equals(fieldName)) {					
						gameInfo.setPlatform(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("recommendType".equals(fieldName)) {					
						gameInfo.setRecommendType(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("ios_link".equals(fieldName)) {					
						gameInfo.setIos_link(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("android_link".equals(fieldName)) {					
						gameInfo.setAndroid_link(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));					
				}
				if("description".equals(fieldName)) {					
					gameInfo.setDescription(new String(fieldValue.getBytes("iso-8859-1"),"gbk"));				
				}
			} else {//保存上传文件				
				
				//为了防止文件重名,加入随机数和毫秒数
				String random = RandomStringUtils.random(6, true, false);
				//已.作为分隔符将文件名分割,取后缀
				String[] split = item.getName().split("\\.");
				//获取文件名
				String fileName = random + "_" + System.currentTimeMillis() + "_." + split[split.length - 1];
				//不是项目中的upload文件夹,是tomcat目录下的upload,文件放在其中
				String filePath = realPath + "/upload/" + fileName;//文件在数据库的存放目录,带盘符
				File file = new File(filePath);
				item.write(file);
					
				String path = request.getContextPath();
				String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
				if("gicon".equals(item.getFieldName())) {
					//访问图片的网络地址
					String gicon = basePath + "upload/" + fileName;
					gameInfo.setGicon(gicon);	
				}
				if("pictures".equals(item.getFieldName())) {//游戏详情图片,需要将图片路径拼接到一起
					pictures = pictures + basePath + "upload/" + fileName + "_;";//拼接图片网络路径
					
				}
				}
								
			}
			//设置所有图片路径
			gameInfo.setPictures(pictures);
			gsd.addGame(gameInfo);
			//使用模态框时保证页面不跳转
			//request.getRequestDispatcher("/").forward(request, response);
		}

上面是后台的Java代码,只是最基本的,没有进行文件校验,也没有设置文件上传大小,最大请求值等参数

//formData提交表单数据
	function add() {	
		//在构造FormData对象的时候,把表单的对象,作为一个参数放进去,form就拥有表单的所有数据
		var form = new FormData(document.getElementById("add"));
		$.ajax({
			type:"post",
			url:"servlet/GameInfoServlet?option=add",
			data:form,
			//告诉jQuery不要去处理发送的数据
			processData:false,
			//告诉jQuery不要去设置Content-Type请求头,因为表单已经设置了multipart/form-data
			contentType:false,
			success:function(data) {
				$("#editModal").modal("hide");
				manage();
			}
		
		});
	}

构造FormData对象的时候,用jQuery选择器会报错,意思似乎是该对象没有继承哪个接口还是怎么的,只能js的选择器,在这花了刚好长时间.

还有就是两个参数:

processData:false,contentType:false,至于为什么要这样设置,自己也是在网上查了以后才知道

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ajax提交form表单可以实现不刷新页面的数据交互,而ajax文件上传则可以实现异步上传文件。 首先,需要在前端页面中引入jquery库和jquery.form插件。 然后,通过jquery的ajax方法来提交表单数据,代码如下: ```javascript $(document).ready(function(){ $('#submitForm').click(function(){ var formData = new FormData($('#myForm')[0]); $.ajax({ url: 'submit.php', // 提交的url地址 type: 'POST', // 提交方式 data: formData, dataType: 'json', // 返回值类型 cache: false, // 是否缓存 processData: false, // 是否处理数据 contentType: false, // 是否设置内容类型 success: function(data){ // 成功回调函数 }, error: function(){ // 失败回调函数 } }); return false; }); }); ``` 其中,`#submitForm`为提交按钮的id,`#myForm`为表单的id,`submit.php`为后台处理程序的url地址。 对于文件上传,需要将`processData`和`contentType`设置为`false`,并使用`FormData`对象来传递表单数据,如下所示: ```javascript $(document).ready(function(){ $('#submitForm').click(function(){ var formData = new FormData($('#myForm')[0]); $.ajax({ url: 'submit.php', // 提交的url地址 type: 'POST', // 提交方式 data: formData, dataType: 'json', // 返回值类型 cache: false, // 是否缓存 processData: false, // 是否处理数据 contentType: false, // 是否设置内容类型 success: function(data){ // 成功回调函数 }, error: function(){ // 失败回调函数 } }); return false; }); }); ``` 后台处理程序可以通过`$_FILES`变量来获取上传的文件信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值