文件上传:
首先在<form>表单的enctype属性的值设为enctype="multipart/form-data">
method的请求方式要设置为post,因为上传文件的内容较大,get请求最大为256个字节.
在form中 添加标签<input type="file">
这样在servlet中获取前台页面的值不能再用request.getParameter()的方式。否则内容一致为空。
这时我们引入一个新的工具类commons-fileupload。
需要导入两个包:commons-fileupload和commons-io。
- 核心类:
- DiskFileItemFactory
工厂类,用于创建ServletFileUpload,设置缓存等
该类一般直接使用构造器直接创建实例
方法:
public void setSizeThreshold(int sizeThreshold)
用于设置缓存文件的大小(默认值10kb)
public void setRepository(File repository)
用于设置缓存文件位置(默认系统缓存目录)
- ServletFileUpload
该类用于解析request对象从而获取用户发送的请求参数(包括普通参数和文件参数)
该类需要调用有参构造器创建实例,构造器中需要一个DiskFileItemFactory作为参数
方法:
public List<FileItem> parseRequest(HttpServletRequest request)
解析request对象,获取请求参数,返回的是一个List,List中保存的是一个FileItem对象,一个对象代表一个请求参数。
public void setFileSizeMax(long fileSizeMax)
设置单个文件的大小限制,单位为B
如果上传文件超出限制,会在parseRequest()抛出异常
FileSizeLimitExceededException。
public void setSizeMax(long sizeMax)
限制请求内容的总大小,单位为B
如果上传文件超出限制,会在parseRequest()抛出异常
SizeLimitExceededException。
- FileItem
该类用于封装用户发送的参数和文件,也就是用户发送来的信息将会被封装成一个FileItem对象,我们通过该对象获取请求参数或上传文件的信息。
该类不用我们手动创建,由ServletFileItem解析request后返回。
方法:
String getFieldName()
获取表单项的名字,也就是input当中的name属性的值。
String getName();
获取上传的文件名,普通的请求参数为null。
String getString(String encoding);
获取内容
若为文件,将文件的流转换为字符串。
若为请求参数,则获取请求参数的value。
encoding参数需要指定一个字符集
boolean isFormField();
判断当前的FileItem封装的是普通请求参数,还是一个文件。
如果为普通参数返回:true
如果为文件参数返回:false
String getContentType();
获取上传文件的MIME类型
long getSize();
获取内容的大小
//创建工厂类 DiskFileItemFactory factory = new DiskFileItemFactory(); //创建请求解析器 ServletFileUpload fileUpload = new ServletFileUpload(factory); //设置上传单个文件的的大小 fileUpload.setFileSizeMax(1024*1024*3); //设置上传总文件的大小 fileUpload.setSizeMax(1024*1024*3*10); //设置响应内容的编码 response.setContentType("text/html;charset=utf-8"); try { //解析请求信息,获取FileItem的集合 List<FileItem> items = fileUpload.parseRequest(request); //遍历集合 for (FileItem fileItem : items) { //如果是普通的表单项 if(fileItem.isFormField()){ //获取参数名 String fieldName = fileItem.getFieldName(); //获取参数值 String value = fileItem.getString("utf-8"); System.out.println(fieldName+" = "+value); //如果是文件表单项 }else{ //获取文件名 String fileName = fileItem.getName(); //获取上传路径 String realPath = getServletContext().getRealPath("/WEB-INF/upload"); //检查upload文件夹是否存在,如果不存在则创建 File f = new File(realPath); if(!f.exists()){ f.mkdir(); }; //为避免重名生成一个uuid作为文件名的前缀,去掉UUID中的“-” String prefix = UUID.randomUUID().toString().replace("-", ""); //将文件写入到服务器中
// 有些浏览器获取文件名的时候会包含路径,这时需要去掉路径,也就是去掉之前的字符串,所以+1。
if (filename.contains("\")) {
filename = prefix.substring(prefix.lastIndexOf("\")+1);
}
fileItem.write(new File(realPath+"/"+prefix+"_"+fileName)); //清楚文件缓存 fileItem.delete(); } } } catch (Exception e) { if(e instanceof SizeLimitExceededException){ //文件总大小超出限制 response.getWriter().print("上传文件的总大小不能超过30M"); }else if(e instanceof FileSizeLimitExceededException){ //单个文件大小超出限制 response.getWriter().print("上传单个文件的大小不能超过3M"); } } response.getWriter().print("上传成功");