用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