文章目录
- 实现步骤
- 核心API
- 详情代码
在使用图片上传功能时,本文章采用表单提交的方法来上传,所以在表单当中需要加上参数
enctype="multipart/form-data"
<form name="form1" method="post"
action="<%=request.getContextPath()%>/picture.do?method=addPage"
onsubmit="return checkForm()" enctype="multipart/form-data">
<table border="1">
<tr>
<th><input type="file" id="imgFile" name="image"
onchange="imgPreview(this)" accept="image/*" /></th>
</tr>
<td><input style="float: right" type="submit" value="添加至图片墙" /></td>
</tr>
</table>
</form>
实现步骤
- 创建
DiskFileItemFactory
对象,设置缓冲区大小和临时文件目录。 - 使用
DiskFileItemFactory
对象创建ServletFileUpload
对象,并设置上传文件的大小限制。 - 调用
ServletFileUpload.parseRequest
方法解析request
对象,得到一个保存了所有上传内容的List
对象。 - 对
list
进行迭代,每迭代一个FileItem
对象,调用其isFormField
方法判断是否是上传文件:
- 为普通表单字段,则调用
getFieldName
、getString
方法得到字段名和字段值。 - 为上传文件,则调用
getInputStream
方法得到数据输入流,从而读取上传数据。
核心API
核心API—DiskFileItemFactoryDiskFileItemFactory
是创建FileItem
对象的工厂,这个工厂类常用方法:
-
public void setSizeThreshold(int sizeThreshold)
:设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fileupload
组件将使用临时文件缓存上传文件。 -
public void setRepository(Java.io.File repository)
:指定临时文件目录,默认值为System.getProperty(“java.io.tmpdir”).
-
public DiskFileItemFactory(int sizeThreshold,java.io.File repository)
:构造函数
核心API—-ServletFileUploadServletFileUpload
负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem
对象中。常用方法有:
-
boolean isMultipartContent(HttpServletRequest request)
:判断上传表单是否为multipart/form-data
类型
2.List parseRequest(HttpServletRequest request)
:解析request
对象,并把表单中的每一个输入项包装成一个fileItem
对象,并返回一个保存了所有FileItem
的list
集合。 -
setFileSizeMax(long fileSizeMax)
:设置上传文件的最大值(单个文件),用于设置单个上传文件的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。 -
setSizeMax(long sizeMax)
:设置上传文件总量的最大值(所有上传文件),用于设置请求消息实体内容(即所有上传数据)的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。 -
setHeaderEncoding(java.lang.String encoding)
:设置编码格式。在文件上传请求的消息体中,除了普通表单域的值是文本内容以外,文件上传字段中的文件路径名也是文本,在内存中保存的是它们的某种字符集编码的字节数组,Apache文件上传组件在读取这些内容时,必须知道它们所采用的字符集编码,才能将它们转换成正确的字符文本返回。
核心API—FileItemFileItem
类的常用方法:
-
boolean isFormField()
:isFormField
方法用于判断FileItem
类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true
,否则返回false
。 -
String getName()
:用于获得文件上传字段中的文件名。注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。 -
String getFieldName()
:用于返回表单标签name
属性的值。 -
void write(File file)
:用于将FileItem对象中保存的主体内容保存到某个指定的文件中。如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。 String getString()
:用于将FileItem对象中保存的数据流内容以一个字符串返回,它有两个重载的定义形式:
public Java.lang.String getString();
public java.lang.String getString(java.lang.String encoding) throws java.io.UnsupportedEncodingException,
- 前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码将主体内容转换成字符串。如果在读取普通表单字段元素的内容时出现了中文乱码现象,请调用第二个getString方法,并为之传递正确的字符集编码名称。
-
void delete()
:delete
方法用来清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete
方法将删除该临时文件。尽管当FileItem
对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete
方法可以更早的清除临时文件,释放系统存储资源。
详情代码
private void pictrueUpload(HttpServletRequest request, HttpServletResponse response)
throws IOException, FileUploadException, ClassNotFoundException, SQLException {
// 设置相应编码集
response.setContentType("text/html;charset=UTF-8");
// 定义变量
// 文件保存时候的名字
String fileSaveName = null;
// 解析的结果
List<FileItem> formItemList = null;
// 设置图片保存路径,本次使用本电脑系统作为服务器
String path = this.getServletContext().getRealPath("/") + "WEB-INF/image";
System.out.println("图片的存储路径为:" + path);
// 判断是否存在
File file = new File(path);
if (!file.exists()) {
file.mkdir();// 如果不存在就创建
}
// 创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建具体功能类
ServletFileUpload upload = new ServletFileUpload(factory);
// 处理中文
upload.setHeaderEncoding("utf-8");
// 数据传进去,获取具体解析到的结果
formItemList = upload.parseRequest(request);
// 判断是否包含数据
System.out.println(formItemList.size());
if (formItemList != null && formItemList.size() > 0) {
for (FileItem fileItem : formItemList) {
// 判断是否是文件类型
if (!fileItem.isFormField()) {
String fileName = fileItem.getName(); // 获取上传文件的名字
// 获取后缀
String prifix = fileName.substring(fileName.lastIndexOf(".") + 1);
System.out.println("后缀为:" + prifix);
// 创建ID绑定session,区分用户
String id = UUID.randomUUID().toString();
fileSaveName = id + "." + prifix;
if (prifix.length() == 0) {
fileSaveName = "(NULL)";
}
System.out.println("文件保存的名字为:" + fileSaveName);
// 使用commons-io把图片复制进本地
FileUtils.copyInputStreamToFile(fileItem.getInputStream(), new File(path + "/" + fileSaveName));
}
}
}
String virtualPath = fileSaveName;
// 添加数据库
pictureService.save(virtualPath);
// 重定向
response.sendRedirect(request.getContextPath() + "/picture.do?method=query");
}