/实现表单文件下载
//客户端.html
在这里插入图片描述



//服务器.java,列出下载资源
//首先需要将服务器上的可下载的目录返显给前端页面filelist.jsp
//ListFileServlet

public class ListFileServlet extends HttpServlet{
public void doGet(HttpServletRequsest request,HttpServletResponse response)
throws ServletException,IOExcpetion
{
	//获取上传文件目录
	String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");
	//存储要下载的文件名
	Map<String,String> fileNameMap = new HashMap<String,String>();
	//递归遍历uploadFilePath目录下的所有文件和目录,将文件的文件名存储到map集合中。
	listfile(new File(uplaodFilePath),fileNameMap();//File既可以代表一个文件也可以代表一个目录
	//将Map集合传给filelist.jsp,显示。
	request.setAttribute("fileNameMap",fileNameMap);
	request.getRequestDispather("filelist.jsp").forword(request,response);
	
}
//这里需要说明:在实际的项目中,数据库中是有文件对应文件表的,我们需要去取值即可
public void listfile(File file,Map<String,String> map){
	//如果file代表的不是一个文件,而是一个文件目录
	if(!file.isFile()){
		//列出该目录下所有文件和目录
		File files[] = file.listfile();
		//遍历数组,
		for(File file:files){
			listfile(file,Map);//递归
		}
	}else{
		//处理是文件名,上传后的文件形式是:uuid_文件名,需要去除文件名的uuid部分file.getName().indexOf("_");
		//也有类似8898-82928-2323_你_不_行.avi,那么file.getName().substring(file.getName().indexOf("_")+1);
		String realName = file.getName().substring(file.getName().indexOf("_")+1);
		map.put(file.getName(),realName);//file.getName()是唯一的,因此可以做key
	}
}
public void doGet(HttpServletRequsest request,HttpServletResponse response)
throws ServletException,IOExcpetion
{
	doGet(requset,response);
}

}

//实现文件下载fileDownLoadServlet
public void class fileDownLoadServlet{
public void doGet(HttpServletRequest request,HttpSerletResponse) throw ServletException,IOException{
	//得到要下载的文件名
	String fileName =request.getParameter("filename");
	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.setRequestDispather("/message.jsp").forword(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 = new OutputStream();
	//创建缓冲区
	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 fileSavePath){
	int hashcode =filename.hashCode();
	int dir1 =hashcode&0xf;
	int dir2 =(hashcode&0xf)>>4;
	String dir = fileSavePath+"\\"+dir1+"\\"+dir2;
	File file = new File(dir);
	if(!file.exists()){
		//创建目录
		file.mkdirs();
	}
	return dir;

}
public void doGet(HttpServletRequest request,HttpSerletResponse) throw ServletException,IOException{
	doPost(request,response);
} 

}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐