当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

文件下载的基本实现

发表于: 2013-04-05   作者:ducklsl   来源:转载   浏览次数:
摘要: 可以实现文件下载的方式有各种各样的,可以直接在浏览器打开,也可以作为附件进行下载,这里面的最主要的部分其实就是对HTTP响应头content-disposition的控制。服务器设置响应头,告诉浏览器该以何种的方式(attachment或者inline)以及何种内容类型(response.setContentType("..."))打开文件。 1)显示可以下载文件列表Serv
可以实现文件下载的方式有各种各样的,可以直接在浏览器打开,也可以作为附件进行下载,这里面的最主要的部分其实就是对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以上版本就会提示以压缩文件的方式进行打开。 这点谜团有待解开,有知道的朋友可以告知一下谢谢

文件下载的基本实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
文件的下载: 获取指定目录下的所有文件的名字 FileNameServlet.java文件的内容: package com.test.
phonegap 文件下载 效果图: package com.phonegap.plugins.downloader; import java.io.File; impo
phonegap 文件下载 效果图: package com.phonegap.plugins.downloader; import java.io.File; impo
  当我们实现一个文件下载功能时,大多数人是通过Strust等框架实现的。Strust框架把底层的文件下
.Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,
.Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,
一、如何使用 如果此Servlet命名为download,请求的URL为:/download?path=xxx,请求后出现下载窗口
对Linux熟悉的读者可能会对Linux通过wget下载文件有印象,这个工具功能很强大,在.NET环境下提到下
http://www.ideasandroid.com/archives/328#more-328 本文将介绍在android平台下如何实现多线程下载
在Flex的应用开发中,同ASP.NET,JSP,PHP等应用一样,都会有上传/下载文件的应用需求,Flex的SDK也为
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号