广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州JavaWeb如何实现文件下载功能?_北大青鸟IT学校

作者:邓华发布时间:2021-06-10分类:Java技术浏览:1291


导读:JavaWeb如何实现文件下载功能?相信学过Java的同学都遇到过这个问题,那么答案是什么呢?接下来一起来看看惠州北大青鸟老师是怎么回答的。

JavaWeb如何实现文件下载功能?相信学过Java的同学都遇到过这个问题,那么答案是什么呢?接下来一起来看看惠州北大青鸟老师是怎么回答的。

列出提供下载的文件资源

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

ListFileServlet的代码如下:

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;

 

/**

* @ClassName: ListFileServlet

* @Description: 列出Web系统中所有下载文件

* @author: 孤傲苍狼

* @date: 2015-1-4 下午9:54:40

*

*/

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);

}

 

/**

* @Method: listfile

* @Description: 递归遍历指定目录下的所有文件

* @Anthor:孤傲苍狼

* @param file 即代表一个文件,也代表一个文件目录

* @param map 存储文件名的Map集合

*/

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{

/**

* 处理文件名,上传后的文件是以uuid_文件名的形式去重新命名的,去除文件名的uuid_部分

file.getName().indexOf("_")检索字符串中第一次出现"_"字符的位置,如果文件名类似于:9349249849-88343-8344_阿_凡_达.avi

那么file.getName().substring(file.getName().indexOf("_")+1)处理之后就可以得到阿_凡_达.avi部分

*/

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集合当中。


在Web.xml文件中配置ListFileServlet


<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>

展示下载文件的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>

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

更多Java资讯关注网站动态,或者来惠州北大青鸟新方舟校区了解一下。

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表