<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">commons-fileupload.jar</span>
commos-io.jar
上传三步走
·1工厂类 DiskFileItemFactory
·2解析器:servletFilteUpload
·3表单项:FilteItem
1>创建工厂:直接new就行了
2>创建解析器:servletFilteUpload 直接new用工厂做参数
3>使用解析器的parserequest()方法解析,返回List《fileItem》类型
FilteItem类的方法
isFormFiled();判断是否是表单项
其他的查api
上传的细节:
1文件必须保存在WEB-InF下(不让浏览器直接访问)(防止上传的是.jsp,之后再直接访问,容易出问题)
2 文件名字问题,有时也需要切割
有的文件时绝对路径,
*文件同名问题,需要添加名称前缀,保证不能重复
》 finame=Communutils.uuid+"_"+filename;
3 目录打散问题 ,就是不能再一个文件夹下存的很多文件(防止太慢)
>>自动去生成文件夹,首字母打散,首字母作为文件名称;
>>时间打散;使用当前日期作为目录;
>>哈希打散,通过文件名称得到int值 hashCode();
》他的int值转换成16进制
》通过13进制的前两位生成两层目录;比如是2b,侧有2目录,b目录;/1/b/
4 上传文件大小限制
#单个文件大小限制
# 所有文件大小限制
5缓存大小与临时目录
案例1
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<c:url value='/Upload2Servlet'/>" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
照片 :<input type="file" name="zhaopian"/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
package yuan.cn;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class Upload2Servlet
*/
@WebServlet("/Upload2Servlet")
public class Upload2Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
DiskFileItemFactory dit=new DiskFileItemFactory();
ServletFileUpload sf=new ServletFileUpload(dit);
try {
List<FileItem> file=sf.parseRequest(request);
FileItem file1 = file.get(0);//总共两个项
FileItem file2 = file.get(1);
System.out.println("普通表单项"+file1.getFieldName()+"="+file1.getString("utf-8"));
System.out.println("文件表单向");
System.out.println("content_tyepe" +file2.getContentType());
System.out.println("size"+file2.getSize());
System.out.println("fileName"+file2.getName());
file2.write(new File("E:\\baibing.jpg"));;
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}
还有.jar包导入就行了
解决目录打散以及文件名字细节处理处理servlet方法
package yuan.cn;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import cn.itcast.commons.CommonUtils;
/**
* Servlet implementation class Upload3Servlet
*/
@WebServlet("/Upload3Servlet")
public class Upload3Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//工厂
DiskFileItemFactory df=new DiskFileItemFactory();
ServletFileUpload sf=new ServletFileUpload(df);
sf.setFileSizeMax(100*1024);//限制单个文件大小为100k;必须放在解析之前
sf.setSizeMax(1024*1024);//限制整个表单大小为1M;
try {
List<FileItem> list=sf.parseRequest(request);//解析如果超过大小就会抛出异常
FileItem fi=list.get(1);
//目录打散hashcode
//
String root=this.getServletContext().getRealPath("/WEB-INF/files/");
/**
* 生成两层目录
*/
String filename=fi.getName();
int index=filename.lastIndexOf("\\");
if(index!=-1){
filename=filename.substring(index+1);
}
String savename=CommonUtils.uuid()+"_"+filename;
int code=filename.hashCode();//转化成16进制
String hex=Integer.toHexString(code);
/**
* 获取hex的前两个字母,与root连接在一起生成完整的路径
*/
File dirfile=new File(root,hex.charAt(0)+"/"+hex.charAt(1));
dirfile.mkdirs();
File destFile=new File(dirfile,savename);
fi.write(destFile);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}