`
ducklsl
  • 浏览: 24830 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

文件下载的基本实现

阅读更多
可以实现文件下载的方式有各种各样的,可以直接在浏览器打开,也可以作为附件进行下载,这里面的最主要的部分其实就是对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以上版本就会提示以压缩文件的方式进行打开。这点谜团有待解开,有知道的朋友可以告知一下谢谢
6
0
分享到:
评论
4 楼 ducklsl 2013-04-07  
java.net.SocketException: Connection reset by peer: socket write error
wx_hello 写道
有各问题,就是点击下载时,在弹出的下载狂中,你点击取消按钮时会报异常:

ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at com.app.smart.servlet.DownloadServlet.doPost(DownloadServlet.java:48)
at com.app.smart.servlet.DownloadServlet.doGet(DownloadServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:414)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:764)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:129)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:570)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 24 more

你好,我用了IE8,FF 测试了都不会出现你说的这个问题。另外,我也上网google了下,发现很多人都碰到这个问题,但我看到的一些文章都并没有得到正真的解决~如果你知道如何解决这个问题,希望可以得到你的赐教~!嘿嘿~~共同进步!
3 楼 wx_hello 2013-04-07  
有各问题,就是点击下载时,在弹出的下载狂中,你点击取消按钮时会报异常:

ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at com.app.smart.servlet.DownloadServlet.doPost(DownloadServlet.java:48)
at com.app.smart.servlet.DownloadServlet.doGet(DownloadServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:414)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:764)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:129)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:570)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 24 more
2 楼 ducklsl 2013-04-07  
canghailan 写道
引用
这点谜团有待解开,有知道的朋友可以告知一下谢谢

因为.docx本质上就是一个zip档,你可以把.docx后缀改为.zip,用压缩软件解压开就能看到里面是一堆xml。
谢谢,按照你的方式尝试了下,还真是~长见识了!自己也跑去apache网上看了些POI的东西,发现07版本以上的都是OOXML了。谢谢哈。
1 楼 canghailan 2013-04-07  
引用
这点谜团有待解开,有知道的朋友可以告知一下谢谢

因为.docx本质上就是一个zip档,你可以把.docx后缀改为.zip,用压缩软件解压开就能看到里面是一堆xml。

相关推荐

    JSP实现文件上传与下载.pdf

    "JSP实现文件上传与下载" JSP(Java Server Pages)是一种动态网页技术,用于开发基于Web的应用程序。JSP技术可以和其他Java技术集成,实现复杂的Web应用程序。下面是JSP实现文件上传与下载的知识点总结: 一、JSP...

    cgi实现下载文件

    在这个场景中,我们将探讨如何使用CGI来实现在网页上提供文件下载的功能。 一、CGI基础 1. CGI原理:当用户通过浏览器访问一个特定的CGI程序时,Web服务器会接收请求并转发给CGI应用。CGI应用处理请求,生成响应...

    OKHttp3实现文件下载,断点下载,暂停下载

    本教程将详细介绍如何利用`OKHttp3`实现文件下载,包括完整的断点续传和暂停下载功能。 首先,我们需要理解`OKHttp3`的基本用法。`OKHttp3`是Square公司推出的网络请求库,它通过连接池、缓存机制和高效的响应处理...

    SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作

    SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作 该项目是个人大作业项目源码,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!!!评审分达到95分以上。资源项目...

    java使用itext实现pdf文件下载

    本教程将详细讲解如何使用Itext库实现PDF文件的下载,包括通过系统路径下载和通过浏览器下载两种方式。 首先,我们需要了解Itext的基本用法。Itext提供了一系列的API,可以方便地创建PDF文档的各个元素,如文本、...

    QT 实现文件下载

    以上就是使用QT实现HTTP文件下载的基本流程。在实际项目中,可能还需要处理更多细节,比如错误处理、多线程下载、断点续传等功能,但这个基础框架为你提供了一个良好的起点。通过不断学习和实践,你可以构建出功能...

    用Winsock实现文件的下载

    以下是用Winsock实现文件下载的基本步骤: 1. **初始化Winsock**: 在开始任何网络操作之前,我们需要调用`WSAStartup`函数来初始化Winsock库。这个函数会加载所需的DLL,并设置Winsock的版本。 2. **创建套接字*...

    qt实现https协议文件下载

    对于"qt实现https协议文件下载"这一主题,我们将深入探讨如何利用Qt库来实现安全的HTTPS协议文件下载。 首先,我们需要理解HTTPS协议。HTTPS(HyperText Transfer Protocol Secure)是一种通过SSL或TLS加密的HTTP...

    iOS开发中文件的上传和下载功能的基本实现

    本文介绍如何不借助第三方框架实现iOS开发中得文件上传。  由于过程较为复杂,因此本文只贴出部分关键代码。 主控制器的关键代码: 代码如下: YYViewController.m #import “YYViewController.h” #define ...

    采用http协议实现文件下载功能源代码

    本文将深入探讨如何使用C语言来实现一个基于HTTP协议的文件下载功能,以及它在资源占用和效率上的优势。 HTTP协议是应用层的一个标准协议,主要用于Web浏览器和服务器之间的数据交换。在文件下载场景中,客户端...

    Java实现文件下载

    在Java编程环境中,实现文件下载是一项常见的任务,尤其在Web应用程序开发中。...通过阅读和理解这份文档,开发者可以更好地掌握Java文件下载的实现技巧。在实际应用中,可以根据项目需求进行相应的调整和扩展。

    C++实现http/https/ftp文件下载

    在C++中实现这些协议的文件下载,通常会涉及以下关键知识点: 1. **套接字编程**:套接字是网络通信的基础,是进程间通信的一种方式。C++中可以使用标准库`&lt;sys/socket.h&gt;`或第三方库如libcurl来创建和管理套接字。...

    Android文件下载(实现断点续传)

    综上所述,实现Android文件的断点续传下载主要依赖于Java的RandomAccessFile类和多线程技术,通过精确控制文件的读写位置和下载范围,确保下载的连续性和可靠性。这种技术不仅提高了用户的下载体验,也在一定程度上...

    java实现文件下载

    - 在实现下载功能时,还需要注意处理异常情况,如文件不存在、读取错误等,并给出适当的错误提示。 8. 结语 通过上述讨论,我们可以了解到Java和Struts2框架实现文件下载的基本原理和实现方式。开发者可以在此基础...

    STM32+LWIP+OS http下载文件C语言实现

    这个项目的目标是利用STM32、LWIP和操作系统来实现在C语言环境中通过HTTP协议下载文件。 首先,我们需要理解HTTP协议的基本工作原理。HTTP(HyperText Transfer Protocol)是一种应用层协议,主要用于传输超文本...

    winform实现FTP上传、下载、删除文件

    在本文中,我们将深入探讨如何使用WinForm应用程序实现FTP(File Transfer Protocol)的基本操作,包括文件的上传、下载和删除。WinForm是.NET框架中用于创建桌面应用的用户界面组件,而FTP则是一种广泛用于互联网上...

    C++实现文件下载

    本文将深入探讨如何使用C++实现文件下载,特别是从URL获取网络文件的过程。 首先,我们需要理解文件下载的基本原理。在互联网上,文件下载通常是通过HTTP或HTTPS协议完成的。这些协议允许客户端(即我们的C++程序)...

    文件服务器mino实现文件存储和文件预览接口

    总的来说,这个项目提供了一个完整的解决方案,涵盖了文件的上传、下载和预览,对于初学者来说,这是一个很好的实践案例,可以帮助理解如何将MinIO与SpringBoot结合使用,实现一个简单的文件管理系统。通过学习和...

    服务器当作网盘实现文件下载

    最后,为了便于用户管理和查找文件,可能还需要实现文件分类、搜索功能,以及提供文件预览(如图片、文档等)的选项。这通常需要额外的库或API支持,例如PDF.js用于预览PDF文件。 总的来说,将服务器当作网盘实现...

    使用QT实现文件上传和下载----ftp服务器

    以上代码展示了使用QT实现FTP文件上传和下载的基本流程。实际应用中,可能需要添加更复杂的错误处理、进度显示、多线程支持等功能。QT库的强大之处在于其灵活性,可以根据项目需求进行扩展和定制。 总结来说,QT...

Global site tag (gtag.js) - Google Analytics