文件下载的基本实现

编程技术  /  houtizong 发布于 3年前   70
可以实现文件下载的方式有各种各样的,可以直接在浏览器打开,也可以作为附件进行下载,这里面的最主要的部分其实就是对HTTP响应头content-disposition的控制。服务器设置响应头,告诉浏览器该以何种的方式(attachment或者inline)以及何种内容类型(response.setContentType("..."))打开文件。
1)显示可以下载文件列表Servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {List<String> fileList = getFileName("F:\\downloadtest");//指定文件存放位置request.setAttribute("lists", fileList);//设置到request中request.getRequestDispatcher("list.jsp").forward(request, response);//将请求转发}/** * 列出path路径下可以下载的文件名 * @param path * @return */public static List<String> getFileName(String path){List<String> fileNames =new ArrayList<String>();File source = new File(path);if(source.isDirectory()&&source.exists()){//判断是否存在以及是否是一个目录File[] files = source.listFiles();for(File file:files){fileNames.add(file.getName());//获得文件目录}}return fileNames;}
2)list.jsp界面代码,用来显示可以现在的文件名
<body>  <%  List<String> fileNames =(List<String>) request.getAttribute("lists");  for(String name:fileNames){  %>  [url=DownloadServlet?filename=<%=name %>]<%=name%>[/url]<br/><!--传递参数filename-->  <%  }  %>  </body>
3)DownloadServlet实现文件的下载
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("GB2312");String serverPath = "F:\\downloadtest";String fileName = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "GB2312");//get提交的方式去乱码String fullPath = serverPath + "\\" + fileName;System.out.println(fullPath);File file = new File(fullPath);//设置相应头,//attachment是以附件的方式下载,并且文件名为filename后面的字符串的值response.setHeader("content-disposition", "attachment;filename="+ new String(fileName.getBytes("GB2312"), "ISO-8859-1"));//去除文件下载时显示名称乱码InputStream in = null;OutputStream output = null;try {in = new FileInputStream(file);int length = 0;byte buffer[] = new byte[1024];output = response.getOutputStream();while ((length = in.read(buffer)) != -1) {// 如果使用in.read()方法,仅仅可以下载到文件,而不能得到文件的内容output.write(buffer, 0, length);}} catch (Exception e) {e.printStackTrace();} finally {in.close();output.close();}}
在此Servlet中,主要的实现也是依靠对文件的IO操作,其中response.getOutputStream返回的实际类型为ServletOutputStream,它是OutputStream的一个子类,API中说道“Provides an output stream for sending binary data to the client.”
以上的这种方式,是告诉浏览器以附件的方式打开此文件,另外还有一种就是在线的方式打开文件
//可以设置为浏览器直接打开,不使用附件的方式下载;response.setHeader("content-disposition", "inline;filename="+ new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
经过测试,如果使用浏览器直接打开的话,是可以正常显示文件中的内容的(特殊文件除外,如word等,txt、jpeg等文件可以直接打开),而且office2003以上版本就会提示以压缩文件的方式进行打开。这点谜团有待解开,有知道的朋友可以告知一下谢谢

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客