servlet实现文件的上传
文件上传是一个web应用常见的功能
比如:QQ头像,就使用了上传。
邮箱中也有附件的上传和下载功能。
OA系统中审批有附件材料的上传。
1.1前端需要有个form表单标签
method=post请求
(因为post请求是没有长度限制,get请求的话有长度限制,因此form表单在上传文件时要使用post请求)
1.2 form 标签的 encType 属性值必须为 multipart/form-data 值
(encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼
接,然后以二进制流的形式发送给服务器)
1.3 form 标签中使用 input type=file 添加上传的文件
1.4 编写服务器代码(Servlet 程序)接收,处理上传的数据。
由于自己写解析很麻烦 ,于是就可以使用其他写好的工具
commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
用来解析文件
解析上传的数据的代码:
/**
* 用来处理上传的数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
//1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
if (ServletFileUpload.isMultipartContent(req)) {
// 创建 FileItemFactory 工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
// 创建用于解析上传数据的工具类 ServletFileUpload 类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
// 解析上传的数据,得到每一个表单项 FileItem
List<FileItem> list = servletFileUpload.parseRequest(req);
// 循环判断,每一个表单项,是普通类型,还是上传的文件
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
// 普通表单项
System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
// 参数 UTF-8.解决乱码问题
System.out.println("表单项的 value 属性值:" + fileItem.getString("UTF-8"));
} else {
// 上传的文件
System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
System.out.println("上传的文件名:" + fileItem.getName());
fileItem.write(new File("e:\\" + fileItem.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
思路就是:
先判断上传的问题件对否是多段数据
是:创建new ServletFileUpload()对象
解析上传的数据,得到每一个表单项 FileItem
List list = servletFileUpload.parseRequest(req);
for循环遍历列表
循环判断,每一个表单项,是普通类型,还是上传的文件fileItem.isFormField()
如果是普通表单项就直接获取name属性值和value属性值
否则为上传的文件保存到某个文件夹下
但是如果文件名称为中文 则会出现乱码
如何解决?
只需要在请求设置一下字符编码为utf-8