servlet处理html表单文件上传

本文介绍如何使用Servlet处理HTML表单中的文件上传。通过设置表单的enctype属性为multipart/form-data,并利用Servlet 3.0的Part接口,可以轻松实现文件的上传及基本信息的读取。

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

用servlet处理html表单文件上传

多的不说,直接上代码

HTML代码:

<form role="form" action="applyServlet" method="post" enctype="multipart/form-data">
			<div class="form-group">
				<label for="company">申请单位名称</label>
				<input type="text" class="form-control" id="company" name="company" placeholder="请输入申请公司名称">
			</div>
			
			<div class="form-group">
				<label for="agent">申请单位授权人</label>
				<input type="text" class="form-control" id="agent" name="agent" placeholder="请输入申请公司授权人名称">
			</div>
			
			<div class="form-group">
				<label for="tel">联系电话</label>
				<input type="text" class="form-control" id="tel" name="tel" placeholder="请输入申请公司联系电话">
			</div>
			
			<div class="form-group">
				<label for="email">联系邮箱</label>
				<input type="email" class="form-control" id="email" name="email" placeholder="请输入申请公司联系邮箱">
			</div>
			
			<div class="form-group">
				<label for="file">提交资料</label>
				<input type="file" class="form-control" id="file" name="file">
			</div>
				<input type="submit" value="提交">
				<input type="reset" value="重置">
			<div>
		</form>
要在<form>标签后面写一个
enctype="multipart/form-data"

 

servlet代码:(仅doPost()方法相关部分代码,不是全部代码)

protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 编码转换
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");


		// 用于输出数据(测试用)而引用的对象方法
		PrintWriter out = response.getWriter();


		
		//其他的非文件表单还是通过这样的方式获取
		String company = request.getParameter("company");
		String agent = request.getParameter("agent");
		String tel = request.getParameter("tel");
		String email = request.getParameter("email");
		
		
		// 存储路径
		String savePath = request.getServletContext().getRealPath("/WEB-INF/uploadFile");
		
		// 获取上传的文件集合
		Collection<Part> parts = request.getParts();
		
		// 上传单个文件
		// Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
		// Part part = parts[0];//从上传的文件集合中获取Part对象
		Part file = request.getPart("file");// 通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象
		
		// Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
		// 获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
		String header = file.getHeader("content-disposition");
		
		// 获取文件名
		String fileName = getFileName(header);
		
		// 把文件写到指定路径
		file.write(savePath + File.separator + fileName);
		String fileAddr = savePath + "/" + fileName;
		
		
		//存储数据到对应的javaBean中
		infoModel info = new infoModel();
		info.setCompany(company);
		info.setAgent(agent);
		info.setTel(tel);
		info.setEmail(email);
		info.setFile(fileAddr);
		
		//测试用
		out.println("[company]:" + company + "<br/>");
		out.println("[agent]:" + agent + "<br/>");
		out.println("[tel]:" + tel + "<br/>");
		out.println("[email]:" + email + "<br/>");
		out.println("[file]:" + fileName + "<br/>");
		out.println("[存储路径]:" + fileAddr + "<br/>");
		SQLControl ctrl = new SQLControl();
		boolean result = ctrl.saveInfo(info);
		if(result){
			out.println("[结果]:存储成功<br/>");
		}else{
			out.println("[结果]:存储失败<br/>");
		}
		out.flush();
		out.close();
	}


	public String getFileName(String header) {
		/**
		 * String[] tempArr1 =
		 * header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
		 * 火狐或者google浏览器下:
		 * tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
		 * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
		 */
		String[] tempArr1 = header.split(";");
		/**
		 * 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
		 * IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
		 */
		String[] tempArr2 = tempArr1[2].split("=");
		// 获取文件名,兼容各种浏览器的写法
		String fileName = tempArr2[1].substring(
				tempArr2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
		return fileName;
	}


}



完整的项目代码我已经上传到了csdn的code中,只写了上传这一部分,别的没写。不是什么大神,有问题欢迎指出,看了代码有不开心的,轻喷轻喷。。。

https://code.youkuaiyun.com/fd214333890/html_form_update/tree/master

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值