Servlet文件上传
一、jsp内容
1.method=“post”
2.enctype=“multipart/form-data” >
<form action="/fileservlet.do" method="post" enctype="multipart/form-data" >
文件选择:<input type="file" name = "pic" id="pic">
<input type="submit" value = "提交">
</form>
二、servlet
1.首先需要用到两个第三方jar包
2.主要用到三个类
DiskFileItemFactory 生产FileItem的工厂
ServletFileUpload
FileItem
@WebServlet("/fileservlet.do")
public class FileUpload extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
// 解决文件名中文乱码
request.setCharacterEncoding("UTF-8");
// 设置缓存大小 及缓存目录
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletContext servletContext = this.getServletConfig().getServletContext();
// 配置临时文件的存储仓库
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
//创建文件上传的处理器
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 解决文件名中文乱码
fileUpload.setHeaderEncoding("UTF-8");
List<FileItem> items = fileUpload.parseRequest(request);
// 迭代请求
Iterator<FileItem> iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = iterator.next();
if (item.isFormField()) {//判断fileItem是否是普通表单元素
String name = item.getFieldName();//表单元素的nanme属性
String value = item.getString();//表单元素的值
System.out.println(name + "---" + value);
} else {//对文件上传的控件的处理
String fileName = item.getName();//要上传的文件的名称
// 绝对路径
File uploadedFile = new File("D://", fileName);
item.write(uploadedFile);
}
}
} catch (Exception e) {
System.out.println(String.format("解析文件错误%s", e));
}
}
}
三、解决文件名乱码问题
1.// 解决文件名中文乱码
request.setCharacterEncoding(“UTF-8”);
或
// 解决文件名中文乱码
fileUpload.setHeaderEncoding(“UTF-8”);
二选一。
2.如果获取属性值出现中文乱码
获取值时添加编码设置
String value = item.getString("UTF-8")