文件上传案例
(狂神老师的案例)文件上传主要是思路,首先我们需要知道的是,我们是如何把一个文件进行上传的。
我们先在本地找到了要上传的文件->把文件交给浏览器->浏览器通过发送请求,把文件变成流通过网络传输到服务器->服务器接收到之后需要判断是否有文件的存在->如果有就需要对文件和字段进行区分->如果检测到是文件的话就需要解析,解析请求数据,创建磁盘保存文件夹,根据可以接收的文件和传输路径保存文件。
代码虽然多,但是只要思路清晰即可。
需要注意的问题:
①如果报了IllegalStateException: ContainerBase.addChild这个类型的错误,可以检查一下是不是web项目的artifact没有导入jar包
代码(FileServlet)
@WebServlet("/file")
public class FileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//如果不包含文件就直接结束方法
if (!ServletFileUpload.isMultipartContent(request)) {
return;
}
// 获取tomacat项目磁盘的位置,并且创建保存在web-inf下面的文件夹,把文件保存在那里
String upLoadPath=this.getServletContext().getRealPath("WEB-INF/Upload");
File fileUpLoad=new File(upLoadPath);
// 如果不存在就直接创建文件目录
if(!fileUpLoad.exists()){
fileUpLoad.mkdir();
System.out.println("创建成功");
}
// 创建临时文件
String temppath=this.getServletContext().getRealPath("WEB-INF/tmp");
File filetmp=new File(temppath);
if(!filetmp.exists()){
filetmp.mkdir();
System.out.println("创建成功");
}
try{
//创建DiskFileItemFactory,并且处理文件上传路径和限制文件大小
DiskFileItemFactory factory=getDisFileItemFactory(filetmp);
// 获取upload对象
ServletFileUpload upload=getServletFileUpLoad(factory);
// 使用upload对象,并且解析和处理文件,上传文件
String msg=uploadParseRequest(upload,request,upLoadPath);
System.out.println("可以结束了");
request.setAttribute("msg",msg);
request.getRequestDispatcher("/test.jsp").forward(request,response);
}catch (FileUploadException e){
e.printStackTrace();
}
}
/**
*正式解析请求中的文件,判断是文件还是键值对
* @param upload
* @param request
* @param upLoadPath
* @return
*/
private String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String upLoadPath) throws FileUploadException, IOException {
String msg = "";
// 解析请求,把所有的请求数据封装成一个fileItems,DiskFileItem是处理磁盘的,FileItem是处理请求数据
List<FileItem> fileItems=upload.parseRequest(request);
for(FileItem item:fileItems){
if(item.isFormField()){
String name=item.getFieldName();
String value=item.getString("UTF-8");
System.out.println(name+":"+value);
}else{
System.out.println("我进入了");
// 获取文件名称
String upLoadFileName=item.getName();
System.out.println("上传的文件名:"+upLoadFileName);
// 如果文件不正常就不加载
if(upLoadFileName.trim().equals("")||upLoadFileName==null){
continue;
}
// 获取文件名
String fileName=upLoadFileName.substring(upLoadFileName.lastIndexOf("/")+1);
// 获取文件后缀名
String fileExtName=upLoadFileName.substring(upLoadFileName.lastIndexOf(".")+1);
//UUID可以创建一个唯一的数字,保证文件名的唯一性
//任何一个类在网络传输都需要序列化
// 获取文件名
String uuidPath= UUID.randomUUID().toString();
System.out.println("文件名:"+fileName+"文件类型后缀:"+fileExtName);
String uuidFileName = UUID.randomUUID().toString();
System.out.println("我到这里了");
// 获取文件上传的流,其实就是获取文件的信息
InputStream is = item.getInputStream();
FileOutputStream fos=new FileOutputStream(upLoadPath+"/"+uuidFileName+"."+fileExtName);
// 创建了缓冲区
byte[] buffer=new byte[1024*1024];
int len=0;
while((len=is.read(buffer))>0){
fos.write(buffer,0,len);
}
fos.close();
is.close();
msg="上传成功";
item.delete();
}
}
System.out.println("我返回了");
return msg;
}
/**
* 设置文件上传情况。设置可传文件的大小
* @param factory
* @return
*/
private ServletFileUpload getServletFileUpLoad(DiskFileItemFactory factory) {
//处理文件的解析器
ServletFileUpload upload=new ServletFileUpload(factory);
// 文件处理的过程情况,和上传情况
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long l, long l1, int i) {
System.out.println("文件大小:"+l1+"已经上传了:"+l+" 百分比"+l/l1*100+"%");
}
});
// 处理字符集问题
upload.setHeaderEncoding("UTF-8");
// 文件的最大值
upload.setFileSizeMax(1024*1024*10);
// 总共能上传的文件大小
upload.setSizeMax(1024*1024*10);
return upload;
}
/**
* 文件太大就存在tmp文件夹里,设置好缓存,实际上就是为了处理那些上传的文件比缓存还大的文件,限制文件大小
* 并且处理临时文件的路径
* @param filetmp
* @return
*/
private DiskFileItemFactory getDisFileItemFactory(File filetmp) {
DiskFileItemFactory factory=new DiskFileItemFactory();
//缓冲区大小
factory.setSizeThreshold(1024*1024);
factory.setRepository(filetmp);
return factory;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doPost(request, response);
}
}
代码(index.jsp)
<form action="${pageContext.request.contextPath}/file" method="post" enctype="multipart/form-data">
<p><input type="text" name="good"></p>
<p><input type="file" name="file1"></p>
<p><input type="file" name="file2"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
代码(test.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这就是test
${requestScope.msg}
</body>
</html>