JSP下载文件

文件上传
浏览器在上传的过程中是将文件以流的形式提交到服务器端,一般选择采用apache的开源工具common-fileupload这个文件上传组件,common-fileupload依赖于common-io包,因此开发工程中需要导入common-fileupload 和 common-io包。 


文件下载
对于网站来说,网站本身常常需要提供一些资源或者资料进行下载,说到下载莫过于最原始的方法就是在网页上提供下载的网址。 

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。


一.ListFile.java

1.递归遍历指定目录下的所有文件和目录,并将文件名存储到Map集合中

package com.control;

import javax.servlet.ServletException;
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.util.HashMap;
import java.util.Map;

/**
 * Created by Ray on 2018/3/16 0016.
 **/
public class ListFile extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取指定目录
        String FilePath = "f:/test";
        //存储要下载的文件名
        Map<String,String> fileNameMap = new HashMap<String, String>();
        //递归遍历filepath目录下的所有文件和目录,将文件名存储到map集合中
        listfile(new File(FilePath),fileNameMap);//File既可以代表一个文件也可以代表一个目录
        //将Map集合发送到listfile.jsp页面显示
        request.setAttribute("fileNameMap", fileNameMap);
        request.getRequestDispatcher("listfile.jsp").forward(request,response);
    }

    /**
    * @Author: Ray
    * @Date: 2018/3/17 0017
    * @Description: 递归遍历指定目录下的所有文件和目录,并将文件名存储到Map集合中
    * @Return: 
    */
    public void listfile(File file,Map<String,String> map){
        //如果file代表的不是一个文件,而是一个目录
        if(!file.isFile()){
            //列出该目录下的所有文件和目录
            File[] files = file.listFiles();
            //遍历files[]数组
            for(File f:files){
                //递归
                listfile(f,map);
            }
        }else{
            String fileOrgName = file.getName();
            int index = fileOrgName.lastIndexOf(".");
            String fileName = fileOrgName.substring(0,index);
            System.out.println(file.getName());
            map.put(file.getName(),fileName);
        }
    }
}

二.listfile.jsp

1.遍历Map集合

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">

    <title>文件列表</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
    <!--遍历Map集合-->
    <c:forEach var="fileItem" items="${fileNameMap}">
        <c:url value="/Download" var="downurl">
            <c:param name="filename" value="${fileItem.key}"/>
        </c:url>
        ${fileItem.value}<a href="${downurl}">下载</a>
        <br>
    </c:forEach>
</body>
</html>


三.Download.java

1.设置响应头,控制浏览器下载该文件

2.JSP文件下载中文和空格显示Content-Disposition设置

package com.control;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
 * Created by Ray on 2018/3/16 0016.
 **/
public class Download extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到要下载的文件名
        String fileName = request.getParameter("filename");
        //要下载的文件的目录
        String fileSavePath = "f:/test";
        //要下载的文件
        File file = new File(fileSavePath + File.separator + fileName);
        //如果文件不存在
        if(!file.exists()){
            request.setAttribute("info","您要下载的资源已被删除!");
            request.getRequestDispatcher("messagedownload.jsp").forward(request,response);
            return;
        }

        //设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition","attachment;filename*=UTF-8''" + URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+", "%20"));
        //读取要下载的文件,保存到文件输入流
        FileInputStream in = new FileInputStream(fileSavePath + File.separator + fileName);
        //创建输出流
        OutputStream out = response.getOutputStream();
        //创建缓冲区
        byte buffer[] = new byte[1024];
        int len = 0;
        //循环将输入流中的内容读取到缓冲区当中
        while(0<=(len=in.read(buffer))){
            //输出缓冲区的内容到浏览器,实现文件下载
            out.write(buffer, 0, len);
        }
        //关闭文件输入输出流
        out.close();
        in.close();
    }
}

四.messagedownload.jsp

1.输出提示信息

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">

    <title>下载操作</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
    <link rel="stylesheet" type="text/css" href="css/userStyle.css">

</head>

<body>
<div class="head">下载操作</div>
<div class="out">
    <%
        //获取提示信息
        String info = String.valueOf(request.getAttribute("info"));
        //如果提示信息不为空,则输出提示信息
        if (info != "null") {
            out.print(info);
        }
    %>
</div>
</body>
</html>


五.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app  version="2.5"
          xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>BookList</servlet-name>
        <servlet-class>com.control.BookList</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookList</servlet-name>
        <url-pattern>/BookList</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookAdd</servlet-name>
        <servlet-class>com.control.BookAdd</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookAdd</servlet-name>
        <url-pattern>/BookAdd</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookUpdate</servlet-name>
        <servlet-class>com.control.BookUpdate</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookUpdate</servlet-name>
        <url-pattern>/BookUpdate</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookDoUpdate</servlet-name>
        <servlet-class>com.control.BookDoUpdate</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookDoUpdate</servlet-name>
        <url-pattern>/BookDoUpdate</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookDelete</servlet-name>
        <servlet-class>com.control.BookDelete</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookDelete</servlet-name>
        <url-pattern>/BookDelete</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookDoDelete</servlet-name>
        <servlet-class>com.control.BookDoDelete</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookDoDelete</servlet-name>
        <url-pattern>/BookDoDelete</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookBatchAdd</servlet-name>
        <servlet-class>com.control.BookBatchAdd</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookBatchAdd</servlet-name>
        <url-pattern>/BookBatchAdd</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookBatchDelete</servlet-name>
        <servlet-class>com.control.BookBatchDelete</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookBatchDelete</servlet-name>
        <url-pattern>/BookBatchDelete</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>BookFind</servlet-name>
        <servlet-class>com.control.BookFind</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookFind</servlet-name>
        <url-pattern>/BookFind</url-pattern>
    </servlet-mapping>


    <!--验证码功能-->
    <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>com.control.Login</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/Login</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>DrawImage</servlet-name>
        <servlet-class>com.control.DrawImage</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DrawImage</servlet-name>
        <url-pattern>/DrawImage</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Register</servlet-name>
        <servlet-class>com.control.Register</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Register</servlet-name>
        <url-pattern>/Register</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>LoginUser</servlet-name>
        <servlet-class>com.control.LoginUser</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginUser</servlet-name>
        <url-pattern>/LoginUser</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>ExitLogin</servlet-name>
        <servlet-class>com.control.ExitLogin</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ExitLogin</servlet-name>
        <url-pattern>/ExitLogin</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>Upload</servlet-name>
        <servlet-class>com.control.Upload</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Upload</servlet-name>
        <url-pattern>/Upload</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>ListFile</servlet-name>
        <servlet-class>com.control.ListFile</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ListFile</servlet-name>
        <url-pattern>/ListFile</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Download</servlet-name>
        <servlet-class>com.control.Download</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Download</servlet-name>
        <url-pattern>/Download</url-pattern>
    </servlet-mapping>

    <!--登录拦截-->
    <!--<filter>-->
        <!--<filter-name>LoginFilter</filter-name>-->
        <!--<filter-class>com.Filter.LoginFilter</filter-class>-->
        <!--<init-param>-->
            <!--<param-name>noLoginPaths</param-name>-->
            <!--<param-value>registerUser.jsp;bookList.css;userStyle.css;loginSql.jsp;login.jsp;fail.jsp;Login;ErrorFilter;DrawImage</param-value>-->
        <!--</init-param>-->
    <!--</filter>-->
    <!--<filter-mapping>-->
        <!--<filter-name>LoginFilter</filter-name>-->
        <!--<url-pattern>/*</url-pattern>-->
    <!--</filter-mapping>-->

    <!--配置过滤器-->
    <filter>
        <filter-name>CharSetFilter</filter-name>
        <filter-class>com.Filter.CharSetFilter</filter-class>
        <init-param>
            <!--用来指定一个具体的字符集-->
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <!--映射过滤器-->
    <filter-mapping>
        <filter-name>CharSetFilter</filter-name>
        <!--“/*”表示拦截所有的请求 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--拦截404,500页面-->
    <error-page>
        <error-code>404</error-code>
        <location>/error/error404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/error500.jsp</location>
    </error-page>
    <filter>
        <filter-name>ErrorFilter</filter-name>
        <filter-class>com.Filter.ErrorFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ErrorFilter</filter-name>
        <url-pattern>/error.jsp</url-pattern>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
</web-app>


六.页面效果




ok!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值