Servlet实现文件的上传
-
导入文件上传需要的jar包(maven实现,不包括serlvet的jar包)
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
-
实现jsp显示
<form action="/test/ul" enctype="multipart/form-data" method="post"> 学号<input type="text" name="sno"><br/> 姓名<input type="text" name="name"><br/> 上传<input type="file" name="f"> <input type="submit" value="提交"> </form>
-
enctype=“multipart/form-data” 上传文件时需要设置
[外链图片转存失败(img-Vf0KiRGx-1565777958520)(C:\Users\53495\AppData\Roaming\Typora\typora-user-images\1552460483839.png)]
-
method属性必须设置为post
-
input type属性需要设置为file
-
-
编写Servlet
-
创建UpLoad类继承HttpServlet类并且实现doPost方法
-
设置请求响应字符集
req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8");
-
实现上传代码
-
通过boolean isMultipart = ServletFileUpLoad.isMultipartContent(req);判断是否时上传文件的表单
-
创建FileItemFactory工厂对象
FileItemFcatory factory = new DiskFileItemFactory();
-
创建ServletFileUpLoad对象
ServletFileUpLoad upload = new ServletUpLoad(factory);
-
通过List取出表单信息
List items = upload.parseRequest(req);
-
使用Iterator迭代遍历List
Iterator iter = items.iterator();
while(iter.hasNext()){
-
通过iter获取FileItem对象
FileItem item = iter.next();
-
通过item.isFormField判断是否为表单非文件type
if(item.isFormField){
-
type非file的input 取出input 的name 通过item.getFieldName()
String fieldName = item.getFieldName();
-
通过input的name 确认表单的信息并获取
if(fieldName.equals(“对应的表单名”))
String value = item.getString(“字符集编码”);
}else{
-
获取文件名字
String fileName = item.getName();
-
设置存储路径
File file = new File(“路径”,fileName);
-
上传到设置的存储路径
item.write(file);
}
-
}
-
package updown; 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.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.io.PrintWriter; import java.util.Iterator; import java.util.List; @WebServlet("/ul") public class UpLoad extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); try { boolean ismulipart = ServletFileUpload.isMultipartContent(req); if(ismulipart){ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(req); Iterator<FileItem> iter = items.iterator(); while(iter.hasNext()){ FileItem item = iter.next(); if(item.isFormField()){ String formName = item.getFieldName(); if(formName.equals("sno")){ out.println(item.getString("utf-8")); }else if(formName.equals("name")){ out.println(item.getString("utf-8")); } }else{ //out.println("上传"); String name = item.getName(); out.println(name); //out.println("上传1"); File file = new File("D:\\Study_WorkPlace\\upload",name); //println("上传2"); item.write(file); //out.println("上传3"); out.println("上传成功"); } } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
-
-
特别说明
-
因为ServletUpLoad构造参数需要FileItemFactoty对象所以首先需要创建此工厂
-
获取的单个信息都存在 FileItem对象中 ,通过ServletUpLoad的parseRequest(req)方法获得所有信息存储在集合List
-
在实现上传的代码中item存储的是需要上传的文件的所有信息file文件则是确认文件上传的位置和名字,然后通过**.write()**来实现上传
-
部分浏览器过去文件名字带真实路径,上述方法只适用于上传名字仅为名字的情况
-
名字为真实路径的方法 已解决
package updown; 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.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.io.PrintWriter; import java.util.Iterator; import java.util.List; @WebServlet("/ul") public class UpLoad extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); try { boolean ismulipart = ServletFileUpload.isMultipartContent(req); if(ismulipart){ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(req); Iterator<FileItem> iter = items.iterator(); while(iter.hasNext()){ FileItem item = iter.next(); if(item.isFormField()){ String formName = item.getFieldName(); if(formName.equals("sno")){ out.println(item.getString("utf-8")); }else if(formName.equals("name")){ out.println(item.getString("utf-8")); } }else{ //out.println("上传"); String temp = item.getName(); String[] split = temp.split("\\\\"); String name = split[split.length-1]; out.println(split); //out.println("上传1"); File file = new File("D:\\Study_WorkPlace\\upload",name); //println("上传2"); item.write(file); //out.println("上传3"); out.println("上传成功"); } } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
-
-