javaweb开发之表单异步文件上传,和表单字段提交

本文介绍了在JavaWeb开发中处理表单包含文件上传的情况,当表单类型为multipart/form-data时,后台处理变得复杂。推荐使用第三方库如Apache的commons-fileupload进行文件上传。文章详细讲解了如何部署commons-fileupload-1.2.1.jar和commons-io.jar,并提供了实例演示,包括Ajax部分、编码工具和Servlet核心代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过

    这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。

    最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:

   apache的commons-fileupload : http://commons.apache.org/fileupload/

   O'Reilly的cos:http://www.servlets.com/cos/index.html

    jspsmart的SmartUpload:https://www.cnblogs.com/bhlsheji/p/4390795.html

    我用的是commons-fileupload,目前主要使用这个java组件多一些,并且也相对稳定一些

     一.部署

1.把commons-fileupload-1.2.1.jar和commons-io.jar导入到WEB-INF/lib下,IDE会自动进行配置

二.实例演示

1.自己看代码,都有相关注释,ajax部分

 

function insertintoSumbit(){
          //与传统的ajax请求区别就在于传输的数据类型不同
          var formData = new FormData(document.getElementById("insertFrom"));//必须是new FormData后台才能接收到
          formData.append("orp", "insertinto");
         $.ajax({
		"url" : "servlet/FileUploadControl.do",
		"type" : "post",
		"data" : formData,
		"async": false,  
		"cache": false,
	    "contentType": false,//必须false才会自动加上正确的Content-Type
        "processData": false,//必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理 
		"success" : function(result) {
		        if(result){
		           alert("新增成功");
		           colse();
		           Pagingben("",1);
		        }else{
		           alert("新增失败");
		        }
		}
    });
   }

2.编码方面的工具部分

package com.H2SIMS.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import sun.misc.BASE64Encoder;

public class DownLoadUtils {
	 public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
	        if (agent.contains("MSIE")) {
	            // IE浏览器
	            filename = URLEncoder.encode(filename, "utf-8");
	            filename = filename.replace("+", " ");
	        } else if (agent.contains("Firefox")) {
	            // 火狐浏览器
	            BASE64Encoder base64Encoder = new BASE64Encoder();
	            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
	        } else {
	            // 其它浏览器
	            filename = URLEncoder.encode(filename, "utf-8");
	        }
	        return filename;
	    }
}

3.servlet核心代码

@SuppressWarnings({ "unchecked" })
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		String orp = null;
		if (ServletFileUpload.isMultipartContent(request)) {
			//System.out.println("是multipart类型");
			//文件名
			String uploadFileName = "";
			//文件保存路径(项目根目录下的路径)
			String uploadFilePath = request.getSession().getServletContext()
					.getRealPath("upload/");
			//创建临时文件目录路径
			File tempPatchFile = new File("d:\\temp\\");
			if (!tempPatchFile.exists()) {
				tempPatchFile.mkdir();//如果文件未创建,就创建一个文件夹
			}
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//设置缓冲区大小4kb
			factory.setSizeThreshold(4096);
			//设置上传文件用到临时文件存放路径
			factory.setRepository(tempPatchFile);
			ServletFileUpload upload = new ServletFileUpload(factory);
			//设置单个文件的最大限制
			upload.setSizeMax(1024 * 300);
			List<FileItem> items;
			try {
				//从request中拿到文件流
				items = upload.parseRequest(request);
				for (FileItem fileItem : items) {
					if (!fileItem.isFormField()) { //文件表单字段
						String fileName = fileItem.getName();
						//通过Arrays类的asList()方法创建固定长度的集合
						List<String> filType = new ArrayList<String>();
						filType.add("jpg");
						filType.add("bmp");
						filType.add("gif");
						filType.add("webp");
						String ext = fileName.substring(fileName
								.lastIndexOf(".") + 1);//字符串截取
						if (!filType.contains(ext)) //判断文件类型是否在允许范围内
							out.print("上传失败,文件类型只能是gif、bmp、jpg、webp");
						else {
							if (fileName != null && !fileName.equals("")) {
								File fullFile = new File(fileItem.getName());
								// 将文件保存到服务器上(UUID是通用唯一标识码,不用担心会有重复的名字出现)
								File saveFile = new File(uploadFilePath,UUID.randomUUID()+"_"+fullFile.getName());
								fileItem.write(saveFile);
								uploadFileName = saveFile.getName();//获取文件名
								/*out.print("上传成功后的文件名是:" + uploadFileName
										+ ",文件大小是:" + fileItem.getSize()
										+ "bytes!");*/
								//uploadFilPathString = saveFile.getAbsolutePath();//获取文件绝对路径
							}
						}
					}else {
						//表单非文件字段,取值方式与普通的ajax请求不同,getFieldName()方法用于获取表单字段的name属性值
						//getString()用于获取value值
						if(fileItem.getFieldName().equals("orp")){
							orp=fileItem.getString();
							break;
						}
					}
				}
				if (orp.equals("insertinto")) {
					standard standard = new standard();
					standard.setPackage_path(uploadFileName);
					for (FileItem fileItem : items) {
						if (fileItem.isFormField()) {
							SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
							if (fileItem.getFieldName().equals("std_num")) {
								standard.setStd_num(fileItem.getString("utf-8"));//设置编码
							}
							if (fileItem.getFieldName().equals("zhname")) {
								standard.setZhname(fileItem.getString("utf-8"));
							}
							if (fileItem.getFieldName().equals("version")) {
								standard.setVersion(fileItem.getString("utf-8"));
							}
							if (fileItem.getFieldName().equals("keys")) {
								standard.setKeys(fileItem.getString("utf-8"));
							}
							if (fileItem.getFieldName().equals("release_date")) {
								standard.setRelease_date(format.parse(fileItem.getString()));
							}
							if (fileItem.getFieldName().equals("impl_date")) {
								standard.setImpl_date(format.parse(fileItem.getString()));
							}
						}
					}
					boolean insertinto = service.insertinto(standard);
					if (insertinto) {
						out.print(insertinto);
					}
				}
			} catch (FileUploadException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else {
			
		}
		out.flush();
		out.close();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值