文件上传和下载
准备连个jar包
commons-fileupload-1.3.3.jar
commons-io-2.6.jar
上传步骤
-
创建表单
注意事项:
method的是post,enctype必须是multipart/form-data
input便签里的type必须是file -
创建上传Servlet
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//工厂Disk
DiskFileItemFactory factory = new DiskFileItemFactory();
//由Disk得到ServletFi
ServletFileUpload sfu = new ServletFileUpload(factory);
//设置文件名编码
sfu.setHeaderEncoding("utf8");
//解析req,会得到各个表单项
try {
List<FileItem> fileItems = sfu.parseRequest(req);
//遍历fileItems
for (FileItem fileItem:
fileItems) {
if(fileItem.isFormField()){
String fieldName = fileItem.getFieldName();
String string = fileItem.getString();
System.out.println(fieldName+"--"+string);
}else{
String name = fileItem.getName();
//获取上传路径
String realPath = req.getServletContext().getRealPath("/WEB-INF/upload");
System.out.println(realPath);
//将这个文件写入指定路径的文件中
fileItem.write(new File(realPath,name));
}
}
} catch (Exception e) {
e.printStackTrace();
}
//上传完成后跳转下载页面
resp.sendRedirect("/day0224/demo3.jsp");
}
}
上传的核心是FileItem,
首先我们得有 DiskFileItemFactory,它能设置一些存在在硬盘里的设置,
再靠这个得到ServletFileUpload,靠这个解析request里面的表单数据
上传的路径不是我们可以看到的项目路径里的,比如说这里的upload,我的idea项目可以看到的文件夹里并没有有upload,而是我们布置在服务器的项目里的。所以我们一定要在我们得项目里创建upload文件夹
下载步骤
你得自己写好前端页面,从前端发送文件名字给后端 。
后端根据文件名字找到相应的文件。
单独创建一个下载servlet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取文件名
String filename = req.getParameter("na");
//获取下载路径的输入流
FileInputStream in = new FileInputStream("C:\\Users\\admin\\webProject\\out\\artifacts\\day0224_war_exploded\\WEB-INF\\upload\\" + filename);
//设置响应头的下载格式
resp.addHeader("content-disposition","attachment;filename="+new String(filename.getBytes("GBK"),"Iso8859-1"));
//获取响应的输出流
ServletOutputStream out = resp.getOutputStream();
IOUtils.copy(in,out);
}
resp.addHeader(“content-disposition”,“attachment;filename=”+new String(filename.getBytes(“GBK”),“Iso8859-1”));
这是下载很重要的语句,这行代码就是让文件以下载的形式响应。后面的改变编码格式是为了让下载的文件名不乱码。