为什么要用sevlet进行文件下载,而不是直接把url放在直接anchor里面:
<a href="setup.exe">download</a>
使用上面的方法遇到两个问题:
1.如果用户已经下载过文件,firefox会cache文件,用户再次进行下载时,会从cache里面下载,这样用户可能永远无法拿到最新的安装文件了,除非他清除浏览器的cache
2.尝试在url里面加入时间戳:<a href="setup.exe?time=<%=System.currentTimeMillis()">download</a>
FireFox 中问题解决,但是出现了一个新的问题:ie点击下载后,居然是未知类型的setup文件。
只好用个servlet下载了,对应servlet加入时间戳:
<ahref='downloadSetupApp.do?time=<%=System.currentTimeMillis()%>
Java文件如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class DownloadSetupAppAction extends BaseActionSupport {
public static final Log sysLog = LogFactory
.getLog(DownloadMiniAppAction.class);
/**
* **********************************************************************
* This API is used to download the Setup.exe application. Why need to
* download the file using the servlet rather than directly add
* a link to the page:
* 1.In FireFox, the file is always cached, thus the latest version
* always download from the cache rather than from the site. So the user
* can not get the latest version when he has downloaded the applicaton
* before.
*
* 2.When add a time stamp to prevent cache by the browser, the IE can not
* know the type of the application. So user can not directly install it
* directly
*
*/
public ActionForward execute(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
String downloadPath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/exe/setup.exe";
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0L);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/force-download");
OutputStream out = null;
InputStream fileInputStream = null;
try {
String disHeader = "Attachment;Filename=\"setup.exe\"";
response.setHeader("Content-Disposition", disHeader);
out = response.getOutputStream();
// transfer the file byte-by-byte to the response object
URL url = new URL(downloadPath);
URLConnection con = url.openConnection(); // *
con.connect();
fileInputStream = con.getInputStream();
int i;
while ((i = fileInputStream.read()) != -1) {
out.write(i);
}
} catch (IOException e) {
log.error(e, e);
} catch(Exception e){
log.error(e,e);
}
finally {
try {
if(fileInputStream!=null){
fileInputStream.close();
}
if(out!=null){
out.close();
}
} catch (IOException e) {
log.error(e,e);
}
}
return null;
}
}
分享到:
相关推荐
在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...
本项目的核心是实现文件下载功能,而不是在浏览器中显示文件内容,尤其针对迅雷这样的第三方下载工具进行优化。下面我们将深入探讨如何使用Java的这些技术来实现这一目标。 首先,`jsp`是Java的一个视图技术,主要...
本示例中,我们将探讨如何使用Java Servlet来实现文件的下载功能。 首先,理解HTTP协议是至关重要的,因为它定义了客户端(浏览器)与服务器之间的通信方式。在文件下载场景中,服务器需要响应一个HTTP请求,该请求...
分析这个文件可以帮助我们深入理解解决IE11下载文件乱码问题的方法。具体来说,这个文件可能包含了Servlet的实现,通过设置正确的HTTP响应头,确保文件名在下载过程中正确显示。 总的来说,解决Java Web中IE11下载...
总结一下,这个"Servlet文件下载项目"展示了如何使用Servlet技术实现一个简单的文件下载服务。通过理解Servlet的工作原理、HTTP响应头的设置以及Java I/O流的使用,我们可以构建出更复杂、更安全的文件下载系统。这...
### 基于Servlet的文件下载技术解析 #### 一、引言 在Web应用程序开发过程中,文件上传和下载是常见的需求之一。特别是在企业级应用中,用户经常需要下载诸如报告文档、数据备份等文件。Java Servlet作为一种强大...
这里使用的是一个特殊的MIME类型,它告诉IE浏览器强制下载文件而不是试图显示它。 - **`charset=gb2312`** 指定了字符集,确保文件名能够正确地被解码。 ##### 2. 设置缓存控制 ```java response.setHeader("Cache...
本文将深入探讨如何在Servlet中实现文件的上传和下载功能,以及在页面上利用JSP和Javabean来实例化对象。 首先,文件上传是通过HTTP多部分请求(Multipart Request)来实现的。Servlet 3.0及以上版本提供了对这种...
本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,其中涉及到的主要技术点包括Servlet API、Multipart解析以及文件流操作。 首先,我们需要了解Servlet在文件上传中的作用。Servlet在接收到客户端(通常...
以上代码片段展示了如何使用Servlet进行文件上传和下载的基本操作。在实际应用中,还需要考虑错误处理、权限控制、文件大小限制等问题。对于大型项目,可以考虑使用成熟的框架如Spring MVC,它提供了更高级别的文件...
下面将详细介绍如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传通常涉及到HTTP协议中的`multipart/form-data`编码类型,这是处理表单数据中包含文件的关键。Servlet 3.0及以上版本提供了更方便...
【AjaxSubmit+Servlet实现表单文件上传与下载详解】 在Web开发中,文件上传和下载是常见的功能,尤其是在用户交互丰富的应用中。本项目【Demo Project】利用AjaxSubmit结合Servlet技术,提供了一种高效、异步的方式...
"基于Servlet实现文件的上传与下载"是一个常见的实战任务,它涵盖了网络编程、多线程和文件I/O等多个核心概念。这里我们将深入探讨如何利用Servlet来实现这两个功能。 首先,让我们了解Servlet的工作原理。Servlet...
本教程将深入讲解如何利用JSP和Servlet来实现大型文件的下载功能,这对于构建高效、稳定的Web应用至关重要。 一、Servlet简介 Servlet是Java平台上的一个标准接口,用于扩展服务器的功能。在Web开发中,Servlet通常...
自己用servlet写的文件上传及下载功能带进度条 主要用到两个jar:commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar 内容介绍: com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 ...
文件上传下载是 Web 应用中的一种常见需求,使用 jsp 页面和 servlet 实现文件上传下载是其中的一种解决方案。下面将详细介绍 jsp、servlet 文件上传下载技术。 文件上传下载原理 文件上传下载的原理是将客户端的...
在这个主题中,“jsp+servlet实现文件上传和下载”是核心知识点,我们将深入探讨如何利用这两个组件以及Apache的`commons-fileupload`和`commons-io`库来完成这一任务。 1. **文件上传** 文件上传通常涉及用户通过...
假如一个场景,用户上传文件,某些用户网速较慢,同时存在100个这样的用户,如果BIO且最大线程设为100会导致线程用完。NIO怎么来解决这个问题? 本实例采用tomcat8作为容器,开启异步servlet读写事件,解决高并发IO...
### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...
在本示例中,我们探讨的是如何使用Servlet来实现多文件的批量下载功能。批量下载通常涉及到将多个文件打包成一个压缩文件,然后提供给用户下载,这样可以极大地提高下载效率,尤其当用户需要下载大量小文件时。 ...