前言:浏览器在上传的过程中是将文件以流的形式提交到服务器端的,所以采用apache的开源工具common-fileupload这个文件上传组件,jar包库配置如下:
1. 新建一个web项目
2. 使用maven添加上传需要的jar包依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
如果不是maven项目,可直接添加commons-fileupload.jar、commons-io.jar包进web项目
3、表单配置
<form action="${basePathUrl}file/uplaodServlet" enctype="multipart/form-data" method="post">
上传用户:<input type="text" name="username"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
4、上传servlet
public class UploadServlet extends HttpServlet{
Logger logger = Logger.getLogger(UploadServlet.class);
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
//得到文件保存目录
String savePath = this.getServletContext().getRealPath("/upload");
File file = new File(savePath);
System.out.println("目录:"+savePath);
if(!file.exists() && !file.isDirectory()){
System.out.println("目录不存在,需创建");
file.mkdir();
}
String message = "";
try {
//Apache文件上传组件处理文件上传步骤:
//创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//判断提交的数据是狗是上传表单的数据
if(! ServletFileUpload.isMultipartContent(request)){
return;
}
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> list = upload.parseRequest(request);
for(FileItem item :list){
//普通数据项
if(item.isFormField()){
String name = item.getFieldName();
String value = item.getString("utf-8");
System.out.println(name+"="+value);
}else {
//封装的是上传文件
String filename = item.getName();
System.out.println(filename);
if(filename.isEmpty()){
continue;
}
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\")+1);
//获取item中的文件输入流
InputStream in = item.getInputStream();
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath +"\\"+filename);
//创建一个缓冲区
byte buffer[] = new byte[1024];
//创建一个输入流结束标识
int len = 0;
//将输入流读入缓冲区中
while((len = in.read(buffer))>0 ){
out.write(buffer,0,len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
//删除临时文件
item.delete();
message ="文件上传成功";
}
}
} catch (Exception e) {
message="上传失败";
e.printStackTrace();
}
request.setAttribute("message", message);
request.getRequestDispatcher("/common/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
doGet(request, response);
}
}
5、web.xml配置
<servlet>
<servlet-name>uploadServlet</servlet-name>
<servlet-class>test.servlet.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadServlet</servlet-name>
<url-pattern>/file/uplaodServlet</url-pattern>
</servlet-mapping>
参考代码:
孤傲苍狼:http://www.cnblogs.com/xdp-gacl/p/4200090.html
Shb_derek技术专栏:http://blog.youkuaiyun.com/shb_derek1/article/details/8543152