我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个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
//递归遍历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
//如果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方法内部用到了递归,在实际开发当中,我们肯定会在数据库创建一张表,里面会存储上传的文件名以及文件的具体存放目录,我们通过查询表就可以知道文件AxiTrader代理申请www.fx61.com/brokerlist/axitrader.html的具体存放目录,是不需要用到递归操作的,这个例子是因为没有使用数据库存储上传的文件名和文件的具体存放位置,而上传文件的存放位置又使用了散列算法打散存放,所以需要用到递归,在递归时,将获取到的文件名存放到从外面传递到listfile方法里面的Map集合当中,这样就可以保证所有的文件都存放在同一个Map集合当中。
配置
在Web.xml文件中配置ListFileServlet
下载页面
展示下载文件的listfile.jsp页面如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
/**
@Description: ie, chrom, firfox下处理文件名显示乱码
*/
public static String processFileName(HttpServletRequest request,
String fileNames) {
String codedfilename = null;
try {
String agent = request.getHeader("USER-AGENT");
if (null != agent && agent.indexOf("MSIE") > -1 || null != agent
&& agent.indexOf("Trident") > -1) {// ie
String name = java.net.URLEncoder.encode(fileNames, "UTF8").replaceAll("\+","%20");
codedfilename = name;
} else {// 火狐,chrome等
codedfilename = new String(fileNames.getBytes("UTF-8"),
"iso-8859-1");
}
} catch (Exception e) {
logger.error("文件名称编码出错", e);
}
return codedfilename;
}
下载文件代码需要注意的地方就只有文件名称的编码问题,其他代码很简单,需要特别注意URLEncoder.encode将空格转换为+,需要特殊处理转换为%20
3.下载后台实时生成的文件
简单的后台实时生成文件基本代码和步骤二一致,只是将从网络获取的文件改为从本机获取就行了
4.使用post方法下载文件
post方法下载文件主要可以通过两种方式解决
第一种将post提交到当前页面的隐藏iframe即可,但这种方式在ie和chmore中会有两种表现形式(一种直接在当前页面下载,一种会打开一个空白页下载)
var downLoadFile = function (options) {
var config = $.extend(true, {method: 'post'}, options);
var $iframe = $('