javaweb上传下载实例完整版解析(下)

网友投稿 176 2023-06-16


javaweb上传下载实例完整版解析(下)

一.显示下载的文件资源

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

1.1 文件下载页面

download.html代码如下:

1.2 controller

@RequestMapping(value = "/download", method = RequestMethod.POST)

@ResponseBody

public Map download(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws ServletException, IOException{

Map map = fileLoadService.doGet(request, response);

return map;

}

1.3 service

/**

* 文件下载显示

* @ClassName: FileLoadServiceImpl

* @throws IOException

* @throws ServletException

*/

@Override

public Map doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

//获取上传文件的目录

String uploadFilePath = "/D:/Download/";

//存储要下载的文件名

Map fileNameMap = new HashMap();

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

listfile(new File(uploadFilePath),fileNameMap);

return fileNameMap;

}

public void listfile(File file,Map map){

//如果file代表的不是一个文件,而是一个目录

if(!file.isFile()){

//列出该目录下的所有文件和目录

http:// 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);

}

二.下载显示的文件资源

2.1 controller

@RequestMapping(value = "/downloadFile", method = RequestMethod.GET)

@ResponseBody

public void downloadFile(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws ServletException, IOException{

String filename =request.getParameter("fileName");

fileLoadService.doGetFile(request, response ,filename);

}

2.2 service

/**

* 下载文件到本地 start

*/

@Override

public void doGetFile(HttpServletRequest request, HttpServletResponse response,String filename) throws ServletException,IOException {

//得到要下载的文件名

String fileName = filename;

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

String fileSaveRootPath="/D:/Download";

File file = new File(fileSaveRootPath + "/" + fileName);

//如果文件不存在

if(!file.exists()){

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

return;

}

//处理文件名

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

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

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

InputStream fis = new BufferedInputStream(new FileInputStream(fileSaveRootPath + "\\" + fileName));

byte[] buffer = new byte[fis.available()];

fis.read(buffer); //读取文件流

fis.close();

response.reset(); //重置结果集

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

response.addHeader("Content-Length", "" + file.length()); //返回头 文件大小

response.setContentType("application/octet-stream"); //设置数据种类

OutputStream os = new BufferedOutputStream(response.getOutputStream());

os.write(buffer); // 输出文件

os.flush();

os.close();

}

public void doPostFile(HttpServletRequest request, HttpServletResponse response,String filename)throws ServletException, IOException {

doGetFile(request, response,filename);

}

以上文件下载完成。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:angular forEach方法遍历源码解读
下一篇:java文件上传(单文件 多文件)与删除
相关文章

 发表评论

暂时没有评论,来抢沙发吧~