JavaWeb中的文件上传和下载

来源:互联网 发布:c语言打印倒九九乘法表 编辑:程序博客网 时间:2024/06/04 18:05

对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。


servlet控制器

 package com.mipo.servlet;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;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;import org.apache.tomcat.util.http.fileupload.IOUtils;public class CommonFileUploadController extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String method = request.getParameter("method");if(null == method || "".equals(method)) {processUpload(request,response);}else if("listFiles".equals(method)) {processListFiles(request,response);}else if("download".equals(method)) {processDownload(request,response);}}/** * 下载文件 * @param request * @param response */private void processDownload(HttpServletRequest request, HttpServletResponse response) {//得到要下载的文件名String filename = request.getParameter("filename");//二进制文件数据response.setContentType("application/octet-stream");try {//处理下载文件-中文文件名乱码问题            response.setHeader("Content-Disposition", "attachment; filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1"));//getRealPath(String path)为给定虚拟路径返回包含实际路径的 String。            //获取文件路径String filepath = this.getServletContext().getRealPath("/upload")+File.separator+filename;/*绝对路径(D:\Eclipse\.meta data\. plugins\org.eclipse.wst.server.core\tmp0\wtpwebsaspps\JSP文件上传与下载\ u p load\图表.docx)*/System.out.println("filepath:"+filepath);//得到要下载的文件File file = new File(filepath);//读取下载的文件,保存到输入流中InputStream is = new BufferedInputStream(new FileInputStream(file));//创建输出流ServletOutputStream os = response.getOutputStream();//Apache中Commons IO的jar包封装好的复制方法,直接调用即可IOUtils.copy(is, os);//刷新输出流os.flush();//关闭输入输出流os.close();is.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/** * 显示可下载文件列表 * @param request * @param response */private void processListFiles(HttpServletRequest request, HttpServletResponse response) {//获取上传文件目录下所有文件File file = new File(this.getServletContext().getRealPath("/upload"));//listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。将此数组保存到request中request.setAttribute("files", file.listFiles());try {//转发到file-download.jsprequest.getRequestDispatcher("file-download.jsp?servletName="+request.getParameter("servletName")).forward(request, response);} catch (ServletException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();};}/** * 上传文件 * @param request * @param response */private void processUpload(HttpServletRequest request, HttpServletResponse response) {//为基于磁盘的文件创建一个工厂DiskFileItemFactory factory = new DiskFileItemFactory();//创建一个文件上传解析器ServletFileUpload upload = new ServletFileUpload(factory);//解决上传文件名的中文乱码upload.setHeaderEncoding("UTF-8");String value = null;try {//使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> items = upload.parseRequest(request);for (FileItem item : items) {//如果FileItem中封装的是普通输入项(普通组件)的数据if(item.isFormField()) {//获取HTML表单中组件的名字String name = item.getFieldName();if("servletName".equals(name)) {value = item.getString();//表单中组件的值System.out.println(name+"="+value);//servletName=CommonFileUploadController}//如果FileItem中封装的是上传文件}else {String path = this.getServletContext().getRealPath("/upload") + File.separator + item.getName();/*绝对路径 D:\Eclipse\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\JSP文件上传与下载\ u p load\图表.docx)*/System.out.println("path:"+path);                    //将文件写入到指定文件中item.write(new File(path));}}//重定向到servletresponse.sendRedirect(request.getContextPath() + "/CommonFileUploadController?method=listFiles&servletName=" + value);} catch (FileUploadException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}

index.jsp

<%@ 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><jsp:forward page="file-upload.jsp"><jsp:param value="CommonFileUploadController" name="servletName"/></jsp:forward></body></html>

file-upload.jsp

<%@ 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><!-- method=“post”:文件上传必须使用post,因为使用get能够传送的数据大小有限制enctype=“multipart/form-data”:表明当前表单提交的数据有多个部分组成 --><form action="${pageContext.request.contextPath}/${param.servletName}"method="post" enctype="multipart/form-data"><input type="text" name="servletName" value="${param.servletName }"><input type="text" name="name" value="jobs"> <input type="file" name="file"><button type="submit">Submit</button></form></body></html>
file-download.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!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><ul><c:forEach items="${files }" var="file"><li><a href="${pageContext.request.contextPath}/${param.servletName}?method=download&filename=${file.name}">${file.name}</a></li></c:forEach></ul></body></html>

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID" version="3.1"><display-name>JSP文件上传与下载</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>CommonFileUploadController</servlet-name><servlet-class>com.mipo.servlet.CommonFileUploadController</servlet-class></servlet><servlet-mapping><servlet-name>CommonFileUploadController</servlet-name><url-pattern>/CommonFileUploadController</url-pattern></servlet-mapping></web-app>

运行结果




0 0
原创粉丝点击