实现文件上传 首先需要有一个页面,包含form表单,并且from表单的method必须是post,enctype必须是multipart/form-data
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="/uploadServlet">
用户名:<input type="text" name="username"><br/>
头像:<input type="file" name="pic"><br/>
<input type="submit"><br/>
</form>
</body>
</html>
enctype = "multipart/form-data" 表示提交的数据,
以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
文件上传时发送的HTTP协议内容
实现Servlet程序完成文件上传
1、首先需要导入相关jar包 commons-fileupload-1.2.1.jar和commons-io-1.4.jar
2、 commons-fileupload-1.2.1.jar和commons-io-1.4.jar包中,我们常用的到类
ServletFileUpload类,用于解析上传的数据
FileItem类,表示每一个表单项
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request); 用于判断当前上传的数据格式是否是多段的格式
public List<FileItem> parseRequest(HttpServletRequest request); 用于解析上传的数据
boolean FileItem.isFromField(); 用于判断当前这个表单项,是否是普通的表单项。还是上传的文件类型
true表示普通类型的表单项,,false表示长传的文件类型
String FileItem.getFiledName(); 用于获取表单项的name属性值
String FileItem.getString(); 用于获取当前表单项的值。
String FileItem.getName(); 用于获取上传的文件名
void FileItem.write(File file); 用于将上传的文件写到file所指向的磁盘位置
Servlet程序代码实现
package com.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class uploadServlet extends HttpServlet {
/**
* 用来处理文件上传
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.判断上传的数据是否是多段数据(只有是多段数据,才是文件上传)
if(ServletFileUpload.isMultipartContent(request)){
//创建FileItemFactory工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
//创建用于解决上传数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
//解析上传的数据
List<FileItem> list = servletFileUpload.parseRequest(request);
//判断每一个表单项,是一个普通类型还是上传的文件
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();
}
}
}
}