java中文件下载
/实现表单文件下载//客户端.html下载文件,//服务器.java,列出下载资源//首先需要将服务器上的可下载的目录返显给前端页面filelist.jsp//ListFileServletpublic class ListFileServlet extends HttpServlet{public void doGet(HttpServletRequses...
·
/实现表单文件下载
//客户端.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);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)