一、介绍
- 要有一个form标签,method=post请求
- form标签的encType属性值必须为multipart/form-data
- 在form标签中使用input type=file添加上传的文件
- 编写服务器代码接受,处理上传的数据
<body>
<form action="" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br>
头像:<input type="file" name="photo"> <br>
<input type="submit" value="上传">
</form>
</body>
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件上传过来了");
}
}
二、文件上传时HTTP协议内容
表示提交的数据类型
multipart/form-data表示提交的数据,以多段(每个表单项一个数据段)的形式进行拼接,然后以二进制流形式进行拼接,然后以二进制流的形式发给服务器。
boundary表示每段数据分隔符
三、接收数据
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("文件上传过来了");
//客户端以流的形式接收
ServletInputStream is = req.getInputStream();
byte[] buffer=new byte[102400];
int read=is.read(buffer);
System.out.println(new String(buffer,0,read));
}
}
此时收到的数据:
发现这些数据都已经发送到了服务器,接下来需要解析这部分的数据
四、上传需要用到的类和方法
调包侠——
commons-fileupload-1.2.1
commons-io-1.4
常用类:
ServletFileUpload类 用于解析上传的数据
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("文件上传过来了");
//客户端以流的形式接收
// ServletInputStream is = req.getInputStream();
// byte[] buffer=new byte[102400];
// int read=is.read(buffer);
// System.out.println(new String(buffer,0,read));
//1.先判断上传的数据是否为多段数据(只有是多段的数据,才是文件上传的)
if(ServletFileUpload.isMultipartContent(req))
{
//创建FileItemFactory工厂实现类
FileItemFactory fileItemFactory=new DiskFileItemFactory();
//创建用于解析上传数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
//解析上传的数据,得到每一个表单项FileItem
try {
List<FileItem> list=servletFileUpload.parseRequest(req);
//循环判断,每一个表单项,是普通类型还是上传的文件
for(FileItem f:list)
{
if(f.isFormField())
{
//普通表单项
System.out.println("表单项name属性:"+f.getFieldName());
System.out.println("表单项value属性:"+f.getString("UTF-8"));
}
else
{
//上传的文件
System.out.println("表单项name属性:"+f.getFieldName());
System.out.println("上传的文件名:"+f.getName());
f.write(new File("c:\\"+f.getName()));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}