简介: java文件上传
1.Commons-FileUpload简介
(1)Commons-FileUpload组件
Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目
(2)Commons-FileUpload组件特点
使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能 能够全程控制上传内容 能够对上传文件的大小、类型进行控制
2.Commons-FileUpload组件应用
注意:上传文件时form标签的method属性必须设置为“post”,不能设置为“get”
(1)环境准备
在项目中引入commons-fileupload-1.2.2.jar和commons-io-2.4.jar文件
(2)设置表单的enctype属性
代码语言:javascript复制<form enctype="multipart/form-data" method="post">
(3)在表单中使用File控件选择文件
代码语言:javascript复制<input type="file" name="nfile" />
3.ServletFileUpload类的常用方法
方法名称 | 方法描述 |
---|---|
public void setSizeMax (long sizeMax) | 设置请求信息实体内容的最大允许的字节数 |
public List parseRequest ( HttpServletRequest req) | 解析form表单中的每个字符的数据,返回一个FileItem对象集合 |
public static final boolean isMultipartContent(HttpServletRequest req) | 判断请求信息中的内容 是否是multipart/form-data类型 |
public void setHeaderEncoding ( String encoding) | 设置转换时所使用的字符集编码 |
4.FileItem接口的常用方法
方法名称 | 方法描述 |
---|---|
public boolean isFormField( ) | 判断FileItem对象封装的数据类型(普通表单字段返回true,文件表单字段返回false) |
public String getName( ) | 获得文件上传字段中的文件名(普通表单字段返回null) |
public String getFieldName( ) | 返回表单字段元素的name属性值 |
public void write( ) | 将FileItem对象中保存的主体内容保存到指定的文件中 |
public String getString( ) | 将FileItem对象中保存的主体内容以一个字符串返回。其重载方法public String getString(String encoding)中的参数用指定的字符集编码方式 |
public long getSize( ) | 返回单个上传文件的字节数 |
5.FileItemFactory接口
实现类:DiskFileItemFactory
方法名称 | 方法描述 |
---|---|
public void setSizeThreshold(int sizeThreshold) | 设置内存缓冲区的大小 |
public void setRepositoryPath(String path) | 设置临时文件存放的目录 |
6.fileupload上传示例
工具类
代码语言:javascript复制package utils;
import java.io.File;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import entity.News;
public class FileUpload {
public News fileUpload(HttpServletRequest request, String uploadPath) {
News news = new News();
// 上传的文件名
String uploadFileName = "";
// 表单字段元素的属性值
String filedName = "";
// 请求信息中的内容是否是multipart类型
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// 上传文件的存储路径(服务器文件系统上的绝对路径)
// String uploadPath = request.getSession().getServletContext().getRealPath("/upload");
// uploadPath = "D:\study\news_backstage\src\main\webapp\img\images";
// 判断是否是带multipart类型文件上传的表单
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// 解析form表单中所有文件对象
List<FileItem> items = upload.parseRequest(request);
// 迭代FileItem
Iterator<FileItem> iter = items.iterator();
// 循环迭代
while (iter.hasNext()) {
FileItem item = iter.next();
// 如果是普通表单字段
if (item.isFormField()) {
filedName = item.getFieldName();
if ("title".equals(filedName)) {
// 输出姓名普通字段
news.setTitle(item.getString("UTF-8"));
// out.print(item.getString("UTF-8") "上传了文件<br/>");
} else if ("author".equals(filedName)) {
news.setAuthor(item.getString("UTF-8"));
} else if ("content".equals(filedName)) {
news.setContent(item.getString("UTF-8"));
} else if ("typeId".equals(filedName)) {
news.setTypeId(Integer.parseInt(item.getString("UTF-8")));
}
// 如果是文件表单字段
} else {
String fileNames = item.getFieldName();
//如果是小图片
if ("smImg".equals(fileNames)) {
String fileNameSm = item.getName();
if (fileNameSm != null && !"".equals(fileNameSm)) {
uploadFileName = UUID.randomUUID().toString().replaceAll("-", "") fileNameSm;
File saveFile = new File(uploadPath, uploadFileName);
item.write(saveFile);
news.setSmImg(uploadFileName);
}
//如果大是图片
} else if ("laImg".equals(fileNames)) {
String fileNameLa = item.getName();
if (fileNameLa != null && !"".equals(fileNameLa)) {
uploadFileName = UUID.randomUUID().toString().replaceAll("-", "") fileNameLa;
File saveFile = new File(uploadPath, uploadFileName);
item.write(saveFile);
news.setLaImg(uploadFileName);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return news;
}
}