文件上传
1、准备工作
对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的。
采用Apache的开源工具common-fileupload这个文件上传组件。
common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
1.把两个包相应的jar文件拷贝到项目的lib文件夹(自己新建)下
【使用IDEA需要注意修复路径,将lib添加到项目输出目录】
2、使用类介绍
commons-FileUpload 组件的API
ServletFileUpload类 用于实现文件的上传操作
【文件上传注意事项】
1、为保证服务器的安全,上传的文件应放在外界无法直接访问的目录下,例如放于WEN-INF目录下。
2、为防止同名文件产生覆盖现象,要为文件指定一个唯一的文件名。(-时间戳 -uuid -md5 -位运算算法 )
3、要对上传文件的大小进行限制(限制上传文件的最大值)。
4、限制上传文件的类型,在收到上传文件名时,判断文件名(后缀名)是否合法。
【注意事项】
在HTML页面input必须有name<input type="file" name="file">
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="file" name="file"><br>
<input type="submit" value="文件上传">
</form>
</body>
这里文件上传表单中的method和enctype的设置属性是固定的,只能为post和multipart/form-data
【需要用到的类详解】
ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个FileItem对象,在使ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。
所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileItem对象的构造方法或setFileItemFactory()设置ServletFileUpload对象的fileItemFactory属性。
【常用方法介绍】
//isFormFiled方法用于判断FileItem类对象封装的数据是一个普通文本表单,还是一个文件表单,如果是普通表单字段则返回true,否则返回false
boolean isFormFiled();
//getFiledName方法用于返回表单标签name属性的值
String getFiledName();
//getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回
String getString();
//getName方法用于获得文件上传字段中的文件名
String getName();
//以流的形式返回上传文件的数据内容
InputStream getInputStream();
//delete方法用来清空FileItem类对象中存放的主体内容
//如果主体内容被保存在临时文件中,delete方法将删除该临时文件。
void delete();
【ServletFileUpload类】
ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装到一个FileItem对象中,使用其parseRequest(HttpServletRequest)方法可以将通过表单中的每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。使用该方法处理上传文件简单易用。
【核心代码】
package cn.lw.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
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.