在request可以直接得到输入流从而处理上传文件的数据内容,但是很麻烦因为还有post报文的其他内容存在,还得手动区分哪些是文件数据,哪些是表单的其他数据。所以直接使用commons-fileupload组件,处理文件上传。
commons-fileupload依赖于commons-io组件。
下好包导入到WEB-INF/lib下
上demo代码
- jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div style="color:red;">
${sessionScope.message}
</div>
<form action="<%=request.getContextPath() %>/fileup" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" name="submit" value="上传"/>
</form>
</body>
</html>
- servlet
package top.demo.up;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
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 java.io.File;
import java.io.FileOutputStream;
/**
* Servlet implementation class FileUp
*/
public class FileUp extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建 FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
//设置文件在内存中最大的大小 字节为单位
factory.setSizeThreshold(1024*1024*20);
//设置超过最大内存大小后 转储的硬盘目录
File file=new File("F:/uptemp");
if(!file.exists())
{
file.mkdir();
}
factory.setRepository(file);
// 创建servlet文件上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置文件上传最大的总大小 (不是单个文件的大小)
upload.setSizeMax(1024*1024*1024);
//文件上传临时缓冲
byte buf[] =new byte[1024*1024*20];
int len=0;
// 解析请求
try {
List<FileItem> items = upload.parseRequest(request);
for(FileItem item:items) {
if(item.isFormField()) {
//文本域
String name=item.getFieldName();
String value=item.toString();
System.out.println("isFormField"+name+"----"+value);
}else {
//文件
long fileSize=item.getSize();
String fileName=item.getName();
String fileFullHttpType=item.getContentType();
String upFileName = null;
if(fileName.indexOf("\\")!=-1) {
int last=fileName.lastIndexOf("\\");
upFileName=file.toString()+File.separatorChar+fileName.substring(last+1);
}else {
upFileName=file.toString()+File.separatorChar+fileName;
}
System.out.println("上传目录----"+upFileName);
InputStream in=item.getInputStream();
FileOutputStream out=new FileOutputStream(upFileName);
len=0;
if(out!=null)
{
while(-1!=(len=in.read(buf,0,1024*1024*19))) {
out.write(buf, 0, len);
out.flush();
}
if(out!=null)
out.close();
if(in!=null)
in.close();
}else {
request.getSession().setAttribute("message", "创建输出流出错");
response.sendRedirect(request.getContextPath()+"/up/fileup.jsp");
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
System.out.println("文件上传出错");
request.getSession().setAttribute("message", "文件上传出错");
response.sendRedirect(request.getContextPath()+"/up/fileup.jsp");
}
request.getSession().setAttribute("message", "上传文件成功");
System.out.println("文件上传成功");
response.sendRedirect(request.getContextPath()+"/up/fileup.jsp");
}
}