`

用servlet进行文件的下载解决FF Cache和IE无法识别文件类型问题

阅读更多

为什么要用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 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...

    java jsp+servlet实现文件下载(而不是在网页中显示出文件内容) 迅雷下载功能.zip

    本项目的核心是实现文件下载功能,而不是在浏览器中显示文件内容,尤其针对迅雷这样的第三方下载工具进行优化。下面我们将深入探讨如何使用Java的这些技术来实现这一目标。 首先,`jsp`是Java的一个视图技术,主要...

    java servlet实现文件下载

    本示例中,我们将探讨如何使用Java Servlet来实现文件的下载功能。 首先,理解HTTP协议是至关重要的,因为它定义了客户端(浏览器)与服务器之间的通信方式。在文件下载场景中,服务器需要响应一个HTTP请求,该请求...

    Java Web文件下载,解决了使用IE11下载文件时所出现的乱码问题

    分析这个文件可以帮助我们深入理解解决IE11下载文件乱码问题的方法。具体来说,这个文件可能包含了Servlet的实现,通过设置正确的HTTP响应头,确保文件名在下载过程中正确显示。 总的来说,解决Java Web中IE11下载...

    servlet文件下载项目

    总结一下,这个"Servlet文件下载项目"展示了如何使用Servlet技术实现一个简单的文件下载服务。通过理解Servlet的工作原理、HTTP响应头的设置以及Java I/O流的使用,我们可以构建出更复杂、更安全的文件下载系统。这...

    基于servlet的文件下载代码

    ### 基于Servlet的文件下载技术解析 #### 一、引言 在Web应用程序开发过程中,文件上传和下载是常见的需求之一。特别是在企业级应用中,用户经常需要下载诸如报告文档、数据备份等文件。Java Servlet作为一种强大...

    servlet下载文件

    这里使用的是一个特殊的MIME类型,它告诉IE浏览器强制下载文件而不是试图显示它。 - **`charset=gb2312`** 指定了字符集,确保文件名能够正确地被解码。 ##### 2. 设置缓存控制 ```java response.setHeader("Cache...

    Servlet中文件上传和下载

    本文将深入探讨如何在Servlet中实现文件的上传和下载功能,以及在页面上利用JSP和Javabean来实例化对象。 首先,文件上传是通过HTTP多部分请求(Multipart Request)来实现的。Servlet 3.0及以上版本提供了对这种...

    servlet实现文件上传下载

    本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,其中涉及到的主要技术点包括Servlet API、Multipart解析以及文件流操作。 首先,我们需要了解Servlet在文件上传中的作用。Servlet在接收到客户端(通常...

    使用Servlet实现文件的上传与下载

    以上代码片段展示了如何使用Servlet进行文件上传和下载的基本操作。在实际应用中,还需要考虑错误处理、权限控制、文件大小限制等问题。对于大型项目,可以考虑使用成熟的框架如Spring MVC,它提供了更高级别的文件...

    文件上传与下载servlet

    下面将详细介绍如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传通常涉及到HTTP协议中的`multipart/form-data`编码类型,这是处理表单数据中包含文件的关键。Servlet 3.0及以上版本提供了更方便...

    【Demo Project】ajaxSubmit+Servlet表单文件上传和下载

    【AjaxSubmit+Servlet实现表单文件上传与下载详解】 在Web开发中,文件上传和下载是常见的功能,尤其是在用户交互丰富的应用中。本项目【Demo Project】利用AjaxSubmit结合Servlet技术,提供了一种高效、异步的方式...

    基于Servlet实现文件的上传与下载

    "基于Servlet实现文件的上传与下载"是一个常见的实战任务,它涵盖了网络编程、多线程和文件I/O等多个核心概念。这里我们将深入探讨如何利用Servlet来实现这两个功能。 首先,让我们了解Servlet的工作原理。Servlet...

    jsp+servlet实现大型文件下载

    本教程将深入讲解如何利用JSP和Servlet来实现大型文件的下载功能,这对于构建高效、稳定的Web应用至关重要。 一、Servlet简介 Servlet是Java平台上的一个标准接口,用于扩展服务器的功能。在Web开发中,Servlet通常...

    用servlet写的文件上传及下载功能带进度条

    自己用servlet写的文件上传及下载功能带进度条 主要用到两个jar:commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar 内容介绍: com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 ...

    jsp,servlet上传下载文件

    文件上传下载是 Web 应用中的一种常见需求,使用 jsp 页面和 servlet 实现文件上传下载是其中的一种解决方案。下面将详细介绍 jsp、servlet 文件上传下载技术。 文件上传下载原理 文件上传下载的原理是将客户端的...

    jsp+servlet实现文件上传和下载

    在这个主题中,“jsp+servlet实现文件上传和下载”是核心知识点,我们将深入探讨如何利用这两个组件以及Apache的`commons-fileupload`和`commons-io`库来完成这一任务。 1. **文件上传** 文件上传通常涉及用户通过...

    异步servlet上传文件,解决网速慢以及大文件,耗完线程问题

    假如一个场景,用户上传文件,某些用户网速较慢,同时存在100个这样的用户,如果BIO且最大线程设为100会导致线程用完。NIO怎么来解决这个问题? 本实例采用tomcat8作为容器,开启异步servlet读写事件,解决高并发IO...

    jsp+servlet实现文件上传下载

    ### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...

    Servlet实现多文件批量下载

    在本示例中,我们探讨的是如何使用Servlet来实现多文件的批量下载功能。批量下载通常涉及到将多个文件打包成一个压缩文件,然后提供给用户下载,这样可以极大地提高下载效率,尤其当用户需要下载大量小文件时。 ...

Global site tag (gtag.js) - Google Analytics