[原创]Java基础巩固之实现文件下载_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1893 | 回复: 1   主题: [原创]Java基础巩固之实现文件下载        下一篇 
heli.jia
注册用户
等级:少校
经验:874
发帖:21
精华:0
注册:1970-1-1
状态:离线
发送短消息息给heli.jia 加好友    发送短消息息给heli.jia 发消息
发表于: IP:您无权察看 2016-3-30 16:59:16 | [全部帖] [楼主帖] 楼主

我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作。

1.编写一个ListFileServlet,用于列出Web应用系统中所有下载文件。

代码如下:

package me.gacl.web.controller;


import java.io.File;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


 

public class ListFileServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //获取上传文件的目录

        String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");

        //存储要下载的文件名

        Map<String,String> fileNameMap = new HashMap<String,String>();

        //递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中

        listfile(new File(uploadFilePath),fileNameMap);//File既可以代表一个文件也可以代表一个目录

        //将Map集合发送到listfile.jsp页面进行显示

        request.setAttribute("fileNameMap", fileNameMap);

        request.getRequestDispatcher("/listfile.jsp").forward(request, response);

    }

    

     

    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 realName = file.getName().substring(file.getName().indexOf("_")+1);

            //file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复

            map.put(file.getName(), realName);

        }

    }

    

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }

}


  这里简单说一下ListFileServlet中listfile方法,listfile方法是用来列出目录下的所有文件的,listfile方法内部用到了递归,在实际开发当中,我们肯定会在数据库创建一张表,里面会存储上传的文件名以及文件的具体存放目录,我们通过查询表就可以知道文件的具体存放目录,是不需要用到递归操作的,这个例子是因为没有使用数据库存储上传的文件名和文件的具体存放位置,而上传文件的存放位置又使用了散列算法打散存放,所以需要用到递归,在递归时,将获取到的文件名存放到从外面传递到listfile方法里面的Map集合当中,这样就可以保证所有的文件都存放在同一个Map集合当中。


2.在web。xml中配置ListFileSeverlet

代码如下:

<servlet>

     <servlet-name>ListFileServlet</servlet-name>

     <servlet-class>me.gacl.web.controller.ListFileServlet</servlet-class>

</servlet>

 

<servlet-mapping>

     <servlet-name>ListFileServlet</servlet-name>

    <url-pattern>/servlet/ListFileServlet</url-pattern>

</servlet-mapping>


3.显示下载文件页面(listfile.jsp),代码如下:


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE HTML>

<html>

  <head>

    <title>下载文件显示页面</title>

  </head>

  

  <body>

      <!-- 遍历Map集合 -->

    <c:forEach var="me" items="${fileNameMap}">

        <c:url value="/servlet/DownLoadServlet" var="downurl">

            <c:param name="filename" value="${me.key}"></c:param>

        </c:url>

        ${me.value}<a href="${downurl}">下载</a>

        <br/>

    </c:forEach>

  </body>

</html>


4.访问ListFileServlet,就可以在listfile.jsp页面中显示提供给用户下载的文件资源,如下图所示:

1.png


5.实现文件的下载

 编写一个用于处理文件下载的Servlet,DownLoadServlet的代码如下:

package me.gacl.web.controller;


import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.URLEncoder;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class DownLoadServlet extends HttpServlet {


    

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //得到要下载的文件名

        String fileName = request.getParameter("filename");  //23239283-92489-阿凡达.avi

        fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");

        //上传的文件都是保存在/WEB-INF/upload目录下的子目录当中

        String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");

        //通过文件名找出文件的所在目录

        String path = findFileSavePathByFileName(fileName,fileSaveRootPath);

        //得到要下载的文件

        File file = new File(path + "\\" + fileName);

        //如果文件不存在

        if(!file.exists()){

            request.setAttribute("message", "您要下载的资源已被删除!!");

            request.getRequestDispatcher("/message.jsp").forward(request, response);

            return;

        }

        //处理文件名

        String realname = fileName.substring(fileName.indexOf("_")+1);

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

        response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));

        //读取要下载的文件,保存到文件输入流

        FileInputStream in = new FileInputStream(path + "\\" + fileName);

        //创建输出流

        OutputStream out = response.getOutputStream();

        //创建缓冲区

        byte buffer[] = new byte[1024];

        int len = 0;

        //循环将输入流中的内容读取到缓冲区当中

        while((len=in.read(buffer))>0){

            //输出缓冲区的内容到浏览器,实现文件下载

            out.write(buffer, 0, len);

        }

        //关闭文件输入流

        in.close();

        //关闭输出流

        out.close();

    }

    

     

    public String findFileSavePathByFileName(String filename,String saveRootPath){

        int hashcode = filename.hashCode();

        int dir1 = hashcode&0xf;  //0--15

        int dir2 = (hashcode&0xf0)>>4;  //0-15

        String dir = saveRootPath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5

        File file = new File(dir);

        if(!file.exists()){

            //创建目录

            file.mkdirs();

        }

        return dir;

    }

    

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }

}


6.在web.xml中配置DownLoadSeverlet,代码如下:

<servlet>

      <servlet-name>DownLoadServlet</servlet-name>

      <servlet-class>me.gacl.web.controller.DownLoadServlet</servlet-class>

</servlet>

 

<servlet-mapping>

      <servlet-name>DownLoadServlet</servlet-name>

      <url-pattern>/servlet/DownLoadServlet</url-pattern>

</servlet-mapping>


7.点击下载链接即可下载:

3.gif


到此,文件下载就完成实现了.




赞(0)    操作        顶端 
arcona
注册用户
等级:少校
经验:1100
发帖:10
精华:0
注册:2015-6-1
状态:离线
发送短消息息给arcona 加好友    发送短消息息给arcona 发消息
发表于: IP:您无权察看 2016-7-11 10:02:00 | [全部帖] [楼主帖] 2  楼

学习了,感谢分享~



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论