Java Web Day10
本节内容
1.文件上传与下载
一、文件上传
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。
对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
form表单提交的数据类型:enctype :普通参数提交application/x-www-form-urlencoded
文件上传 数据类型:multipart/form-data
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传</title> </head> <body> <form action="../UpLoadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="file1"/><br/> <input type="file" name="file1"/><br/> <input type="text" name="username"/><br/> <input type="submit" value="上传"/> </form> </body> </html>
package com.xk.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; 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 org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * 文件上传 * * @author 27783 * */ @WebServlet("/UpLoadServlet") public class UpLoadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 建立把保存文件上传的目录 String savePath = this.getServletContext().getRealPath("/WEB-INF/upload"); File file = new File(savePath); // 判断上传文件的保存目录是否存在 if (!file.exists() && !file.isDirectory()) { System.out.println(savePath + "目录不存在,需要创建"); // 创建目录 file.mkdir(); } // 上传消息提示 String message = ""; // 使用Apache文件上传组件处理文件上传步骤: // 1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); // 2、创建一个文件上传解析器 ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory); // 3、判断提交上来的数据是否是上传表单的数据 if (!ServletFileUpload.isMultipartContent(request)) { return; } // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 // 解决上传文件名的中文乱码 fileUpload.setHeaderEncoding("utf-8"); try { List<FileItem> listFileitem = fileUpload.parseRequest(request); for (FileItem item : listFileitem) { // 如果fileitem中封装的是普通输入项的数据 if (item.isFormField()) { String name = item.getFieldName(); // 解决普通输入项的数据的中文乱码问题 String value = item.getString("utf-8"); System.out.println(name + " " + value); } else { // 如果fileitem中封装的是上传文件 // 得到上传的文件名称, String filename = item.getName(); // 如果文件名为空跳过 if (filename == null || filename.trim().equals("")) { continue; } // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: // c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分 filename = filename.substring(filename.lastIndexOf("\\") + 1); // 获取item中的上传文件的输入流 InputStream in = item.getInputStream(); // 创建一个文件输出流 FileOutputStream out = new FileOutputStream(savePath + "\\" + filename); // 创建一个缓冲区 byte buffer[] = new byte[1024]; // 判断输入流中的数据是否已经读完的标识 int len = 0; // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据 while ((len = in.read(buffer)) > 0) { // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" // + filename)当中 out.write(buffer, 0, len); } // 关闭输入流 in.close(); // 关闭输出流 out.close(); // 删除处理文件上传时生成的临时文件 item.delete(); message = "文件上传成功!"; } } } catch (FileUploadException e) { message = "文件上传失败!"; } } }
文件下载:
我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>文件下载</title> </head> <body> <% String fail=(String)request.getAttribute("fileinfo"); if("fial".equals(fail)){%> <script type="text/javascript"> alert("文件已不存在"); </script> <% } %> <a href="DowloadServlet?filename=Oracle第五天1.mm">Oracle第五天.mm</a> </body> </html>
package com.xk; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class DowloadServlet */ @WebServlet("/DowloadServlet") public class DowloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename=request.getParameter("filename"); System.out.println(filename); String savePath="G:"+File.separatorChar+"upload"; File file = new File(savePath); File[] listFile= file.listFiles(); for(File files:listFile){ if(files.isFile()){ //文件名 if(filename.equals(files.getName())){ //文件存在 response.setContentType("application/octet-stream"); response.setHeader("content-disposition", "attachment;filename=\""+filename+"\""); File dowloadFile=new File(savePath+File.separatorChar+files.getName()); FileInputStream in = new FileInputStream(dowloadFile); OutputStream out= response.getOutputStream(); byte[] b=new byte[1024]; int len=0; while ((len=in.read(b))!=-1) { out.write(b, 0, len); } out.close(); in.close(); return; } } } //文件不存在 response.setContentType("text/html;charset=utf-8"); request.setAttribute("fileinfo", "fial"); request.getRequestDispatcher("/index1.jsp").forward(request, response); } }