文件上传功能的实现
在servlet3.0之前,文件上传还需要导入两个commonsjar包,而3.0之后,servlet自己就支持了文件上传的组件,本文主要利用后者提供的上传组件完成上传功能。
文件上传细节
1,不能用自带的方法直接获取文件名,一些老版本的浏览器可能会会出现问题(要对文件名进行提取)
2,相同文件上传的覆盖问题
3,上传文件自动创建不同的上传路径
4,文件上传的大小约束
5,文件上传类型的约束
代码实现
UploadUtils.java
这是一个工具类,主要解决自动生成不同文件名以及路径问题
public class UploadUtils {
//创建新的文件名称
public static String createNewFileName(String filename){
String s = UUID.randomUUID().toString().replace("-", "");
return s+"_"+filename;
}
//上传文件时创建不同的上传路径,防止图片过多,打开效率低下
public static String createNewPath(String path,String filename){
int i = filename.hashCode();
int path1=i&0xf;
int path2=(i>>4)&0xf;
String realPath=path+ File.separator+path1+File.separator+path2+filename;
File dir=new File(realPath);
if(!dir.exists()){
dir.mkdirs();
}
return realPath;
}
}
upload.jsp 前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件的上传</title>
</head>
<body>
<h2>文件的上传</h2>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<table>
<tr align="center">
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr align="center">
<td>图片:</td>
<td><input type="file" name="picture1"></td>
</tr>
<tr align="center">
<td>图片:</td>
<td><input type="file" name="picture2"></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
UploadServlet.java
@WebServlet(name = "UploadServlet",value = "/upload")
@MultipartConfig(maxFileSize = 1024*1024*5,maxRequestSize = 1024*1024*20)//必须要添加这个注解,同时有控制文件大小的约束属性
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//servlet3.0之前需要导入jar包,3.0之后不需要导入jar包则可完成文件上传。
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String realPath = request.getServletContext().getRealPath("/WEB-INF/upload");//上传的文件应该放入WEB-INF文件中,防止一些恶意人员在地址栏进行访问。
//支持文件上传的文件类型
List<String> extList=new ArrayList<>();
extList.add("jpg");
extList.add("png");
File dir=new File(realPath);
if(!dir.exists()){
dir.mkdirs();
}
PrintWriter writer = response.getWriter();
//接收参数
Collection<Part> parts = request.getParts();
if(parts!=null&&parts.size()>0){
for (Part part : parts) {
String submittedFileName = part.getSubmittedFileName(); //判断是普通字段还是上传字段
if(submittedFileName==null){
String name = part.getName();
String username = request.getParameter(name);
System.out.println(username);
}else {
if(submittedFileName.equals("")){
//文件名为空
continue;
}
//防止不同浏览器获取到错误格式的文件名进行字符串处理
String header = part.getHeader("content-disposition");
System.out.println(header);
String substring = header.substring(header.lastIndexOf("filename=") + 10, header.length() - 1);
System.out.println(substring);
String filename=substring.substring(substring.lastIndexOf("\\")+1);
String ext = filename.substring(filename.lastIndexOf(".") + 1); //获得后缀类型
if(!extList.contains(ext)){
//上传的文件类型不存在类型列表中,则不允许上传
writer.write("不支持此类型文件进行上传");
continue;
}
//相同文件上传,防止被覆盖
String newFileName = UploadUtils.createNewFileName(filename);
//上传不同的文件到不同的文件夹下面,防止一个页面包含文件过多的问题
String newPath = UploadUtils.createNewPath(realPath, newFileName);
//System.out.println(submittedFileName);
part.write(newPath+File.separator+filename);
writer.write("上传成功:"+submittedFileName);
//删除缓存part
part.delete();
}
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
启动服务器进行测试即可。