步骤分析,
先导入包,
然后,在前端jsp页面创建form表单,更改enctype=“multipart/form-data”.要上传的头像文件类型为,file。
再,在跳转的servlet中用,创建三行语句,接收到输入流数据,解析,放入list中。
接着判断,文件向是否是普通文件项,是则直接放入map集合。不是,则是文件项需要用流写出。
,最后,用文件项,获取读入流,创建文件写出流。用ioutils,直接实现输入输出流的对接。
jsp页面实现代码
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action=" testServlet" method="post" enctype="multipart/form-data">
账号:<input type="text" name="username"></br>
密码:<input type="password" name="password"></br>
头像:<input type="file" name="head"></br>
<button>提交数据</button>
</form>
</body>
</html>
servlet代码实现
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
public class testServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*String username = request.getParameter("username");
String password = request.getParameter("password");
String head=request.getParameter("head");
System.out.println(username);
System.out.println(password);
System.out.println(head);
传统方式获取不到form表单的ectype类型为:multipart/form-data的数据,因为这些数据已经不是键值对的形式传输了
而是通过流的形式进行传输
InputStream stream = request.getInputStream();
int i=stream.read();
while(i!=-1) {
char c=(char)i;
System.out.print(c);
i=stream.read();
}*/
try {
//一下三行代码的三行代码的作用request.getInputStream();获取请求体的全部内容
//进行解析,获得分割线的内容,将其封装在FileItem对象中
DiskFileItemFactory dff=new DiskFileItemFactory();
ServletFileUpload sfu=new ServletFileUpload(dff);
List<FileItem> list = sfu.parseRequest(request);
//创建map集合,键存名字,值存值。
Map<String ,String> map=new HashMap<String,String>();
for (FileItem fi : list) {
//判断该项是否是普通项
if(fi.isFormField()) {
/*System.out.println(fi.getFieldName());//username password
System.out.println(fi.getName()); //null null
System.out.println(fi.getString()); //aaa aa*/
map.put(fi.getFieldName(), fi.getString("UTF-8"));
}else {
//该项是文件项
//获取文件项输入流,放入输入流对象
InputStream is = fi.getInputStream();
//获取要存入的文件夹的绝对路径
String path = request.getSession().getServletContext().getRealPath("/aaa/aaa/");//文件路径
//创建文件,(路径,文件名12312.jpg)
File file=new File(path,fi.getName());
//判断文件是否已经存在,不存在就创建一次;
if(!file.exists()) {
file.createNewFile();
}
//将文件项放到输出流对象内
OutputStream os=new FileOutputStream(file);
//用工具,实现,输入输出流的对接
IOUtils.copy(is, os);
//释放资源
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
//存放键值对
map.put(fi.getFieldName(),"/aaa/aaa/"+fi.getFieldName());
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}