借助Apache提供的一套 commons-fileupload 组件,性能优异 API简单
上传同一文件会出现命名重复的问题,可以使用上传时间的毫秒数避免重复
System.currentTimeMillis()
UUID随机数同样可以避免名称重复
UUID.randomUUID()
一些常用方法
System.out.println("c.getString() = " + c.getString()); //表单内容
System.out.println("c.getName() = " + c.getName()); //文件名称
System.out.println("c.getFieldName() = " + c.getFieldName()); //表单域名称
System.out.println("c.getContentType() = " + c.getContentType());//文件类型
System.out.println("c.getSize() = " + c.getSize());//文件大小
jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
文件上传
1.提交方式必须是post
2.enctype:multipart/form-data
<form action="<%=request.getContextPath()%>/file?method=upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name" value="joker"><br>
图片:<input type="file" name="pic"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
servlet:
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String method = request.getParameter("method");
if ("upload".equals(method)){
upload(request,response);
} else if ("download".equals(method)){
download(request,response);
}
}
//文件下载
private void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
// File file = new File("f:\\test");
response.setHeader("content-disposition","attachment;fileName=tom.jpg"); //打开文件保存窗口
FileInputStream fileInputStream = new FileInputStream("F:\\test\\tom.jpg");
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = -1;
while ((len=fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
fileInputStream.close();
outputStream.close();
}
//文件上传
private void upload(HttpServletRequest request, HttpServletResponse response) {
//借助Apache提供的一套 Commons-fileUpload 组件,性能优异 API简单
//工厂类 获取diskFileItemFactory ---> fileItemFactory
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
servletFileUpload.setSizeMax(1024*1024*30); //总体文件大小限制
servletFileUpload.setFileSizeMax(1024*1024*3); //单个文件大小限制
servletFileUpload.setHeaderEncoding("UTF-8"); //中文乱码
// servletFileUpload.setProgressListener(); //设置上传进度
if (ServletFileUpload.isMultipartContent(request)) { //判断客户端提交的enctype 必须是multipart/form-data
//处理文件上传
try {
//解析当前文件上传的request
List<FileItem> list = servletFileUpload.parseRequest(request);
list.forEach(c->{
if (c.isFormField()){ //判断文件类型
//是普通表单字段
System.out.println("c.getName() = " + c.getName());
System.out.println("c.getString() = " + c.getString()); //表单内容
System.out.println("c.getFieldName() = " + c.getFieldName());
System.out.println("c.getContentType() = " + c.getContentType());
System.out.println("c.getSize() = " + c.getSize());
System.out.println("===================================");
}else {
System.out.println("c.getName() = " + c.getName()); //文件名称
System.out.println("c.getFieldName() = " + c.getFieldName()); //表单域名称
System.out.println("c.getContentType() = " + c.getContentType());//文件类型
System.out.println("c.getSize() = " + c.getSize());//文件大小
System.out.println("==================================");
File file = new File("F:\\test"); //保存到磁盘上
try {
//上传文件名称重复问题
// System.out.println(System.currentTimeMillis()); //根据上传时间毫秒数
// System.out.println(UUID.randomUUID()); //根据UUID随机数
String name = System.currentTimeMillis()+"."+c.getName().split("\\.")[1];
c.write(new File(file,name));
c.delete(); //删除缓存
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (FileUploadException e) {
e.printStackTrace();
}
} else {
System.out.println("未设置enctype");
}
}
}
运行结果:
如果想要存放到服务器的相对路径可以使用
request.getServletContext().getRealPath("/upload");