使用文件上传至服务器需要导入两包commons-fileupload-1.2.2.jar与commons-io-2.4.jar
本文的servlet使用的是 servlet3.0注解配置, 不用写web.xml 文件了
建立文件时使用javaEE6.0 支持servlet3.0
value的值就是访问路径
urlPatterns的值也是访问路径 例如
@WebServlet(name="DemoServlet3",value="/demoServlet3")
public class DemoServlet3 extends HttpServlet {
...
}
文件上传的表单
method 必须是post
enctype="multipart/form-data"
例如
<form action="${pageContext.request.contextPath}/uploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
请选择文件:<input type="file" name="nfile"/><br/>
<input type="submit" value="上传"/>
</form>
创建表单的步骤
1.创建DiskFileItemFactory 工厂
DiskFileItemFactory dif = new DiskFileItemFactory();
2.创建ServletFileUpload 对象
ServletFileUpload sfu = new ServletFileUpload(dif);
3.判断表单提交 是不是 multipart/form-data
boolean isMultipart = sfu.isMultipartContent(request);
整体代码如下:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
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;
@WebServlet(name="UploadServlet" ,urlPatterns="/uploadServlet")
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("------------文件上传----------------");
//文件上传路径 我的文件上传的是F:\tomcat7\webapps\javaweb项目名下WebRoot中的的新建file文件夹里
String readPath=this.getServletContext().getRealPath("file");
//创建DiskFileItemFactory工厂
DiskFileItemFactory dif=new DiskFileItemFactory();
ServletFileUpload sfu=new ServletFileUpload(dif);
boolean iMmultipart = sfu.isMultipartContent(request);
if(iMmultipart){
//进行文件上传
try {
//解析请求 获取表单元素即表单的全部提交信息
List<FileItem> items =sfu.parseRequest(request);
if(items!=null){
for (FileItem item : items) {
if(item.isFormField()){ //判断是否是普通字段(即上传的用户名密码等)
String fileName=item.getFieldName();
String value=item.getString("UTF-8");
System.out.println(fileName+"----------"+value); //读取用户名密码等文件
}else{
//是要上传的文件
//获取上传的文件名
String fileName=item.getName();
System.out.println("上传的文件名: "+fileName);
//新建一个文件对象 第一个参数放文件上产路径
File file=new File(readPath,fileName);
//开始上传
item.write(file);
System.out.println("文件上传成功! 文件名是"+fileName);
}
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
如果再加上 限制文件上传的类型和大小
类型: List<String> filTypes = Arrays.asList("jpg","png","gif","bmp");
大小:
//设置单个文件的最大限制
upload.setSizeMax(1024*30);
获取上传文件名的后缀:
String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
System.out.println("后缀:"+fileType);
boolean flag = filTypes.contains(fileType);
完整的代码如下:
package cn.bdqn.demo;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
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.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet(name="UploadServlet",value="/uploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = -2590255173244980573L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("----文件上传---------");
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//获取上传文件的路径
String realPath = this.getServletContext().getRealPath("files");
System.out.println("上传路径:"+realPath);
//1.创建DiskFileItemFactory
DiskFileItemFactory dif = new DiskFileItemFactory();
//2.创建ServletFileUpload 对象
ServletFileUpload sfu = new ServletFileUpload(dif);
//3.判断表单提交 是不是 multipart/form-data
boolean isMultipart = sfu.isMultipartContent(request);
if(isMultipart){
//进行文件上传
//ServletFileUpload 解析请求 获取元素集合
List<String> filTypes = Arrays.asList("jpg","png","gif","bmp");
//限定单个文件的大小
sfu.setSizeMax(1024*30); //最大30KB
try {
List<FileItem> items = sfu.parseRequest(request);
if(items!=null){
for(FileItem item : items){
if(item.isFormField()){ //判断是否是普通字段
String fieldName = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(fieldName+"---"+value);
}else{
//是文件 文件上传
//获取上传的文件名
String fileName = item.getName();
//判断文件类型是否匹配:
//获取后缀
String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
System.out.println("后缀:"+fileType);
boolean flag = filTypes.contains(fileType);
if(flag){
System.out.println("上传的文件名:"+fileName);
//新建一个文件对象 第一个参数放文件上传路径
File file = new File(realPath, fileName);
//开始上传
item.write(file);
System.out.println("文件上传成功!");
response.getWriter().print("文件上传成功!");
}else{
response.getWriter().print("上传失败!文件类型必须是jpg,png,gif,bmp!");
}
}
}
}
}catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("上传失败,文件太大,单个文件的最大限制是:"+sfu.getSizeMax()+"bytes!");
response.getWriter().print("上传失败,文件太大,单个文件的最大限制是:"+sfu.getSizeMax()+"bytes!");
}catch (Exception e) {
e.printStackTrace();
}
}else{
response.getWriter().print("表单不是multipart/form-data,文件上传失败!");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}