文件上传
-
要有一个form标签,method=post请求
-
在form标签中的encType属性值必须为multipart/form-data值
-
在form标签中使用input type=file添加上传的文件
-
编写服务器代码接受,处理上传的数据。
文件上传时是以二进制流传输,所以要用字节流
req.getInputStream();
代码:
ServletInputStream inputStream = req.getInputStream();
byte[] buffer = new byte[1024000];
int read = inputStream.read(buffer);
System.out.println(new String(buffer,0,read));
结果:
将数据上传到服务器之后,我们需要对数据进行解析,需要用到两个包 commons-fileupload-1.4.jar 和 commons-io-2.8.0.jar
在WEB-INF目录下新建一个lib目录,将这两个包导入
commons-fileupload-1.4.jar:https://gitee.com/Doomfist_iron/javaweb/blob/master/jar/commons-fileupload-1.4.jar
commons-io-2.8.0.jar:https://gitee.com/Doomfist_iron/javaweb/blob/master/jar/commons-io-2.8.0.jar
步骤:
- 判断是否是多段数据( ServletFileUpload.isMultipartContent(req) )
- 如果是,创建工厂实现类( FileItemFactory fileItemFactory = new DiskFileItemFactory(); )
- 创建用于解析上传数据的工具类( ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); )
- 解析上传的数据,叨叨每一个表单项( List list = servletFileUpload.parseRequest(req);)
- 循环判断每一个表单项是否是上传的类型 ( fileItem.isFormField() )
代码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
if (ServletFileUpload.isMultipartContent(req)) {
// 创建FileItemFactoserry工厂实现类
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();
}
}
}