用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;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP和ServletJava Web开发中常用的技术。以下是关于文件上传、下载和删除的解释: 文件上传: 在JSP中,可以通过表单中的<input type="file">元素实现文件上传功能。用户选择文件后,可以通过Servlet来处理上传的文件。在Servlet中,可以使用Apache Commons FileUpload库来解析上传的文件,并将其保存到服务器的指定位置。可以使用FileItem类来表示上传的文件,通过FileItem的相关方法来获取文件名、内容类型、大小等信息,并将文件保存到指定的目录。 文件下载文件下载可以通过在JSP页面中提供下载链接或按钮来实现。用户点击链接或按钮后,可以通过Servlet来处理文件下载请求。在Servlet中,可以通过流的方式将指定文件的内容发送给浏览器进行下载。可以使用OutputStream将文件内容写入响应流,设置相应的文件名和内容类型,使浏览器正确识别进行下载文件删除: 文件删除可以通过在JSP页面中提供删除链接或按钮来实现。用户点击链接或按钮后,可以通过Servlet来处理文件删除请求。在Servlet中,可以使用File类来表示要删除的文件,并调用其delete()方法将文件删除。在进行文件删除之前,可以进行相关的权限检查和文件存在性检查,确保只有有相应权限的用户且文件存在的情况下才能进行删除操作。 总结: 通过JSP和Servlet可以实现文件上传、下载和删除功能。文件上传需要使用Apache Commons FileUpload库来解析上传的文件,并将其保存到服务器指定位置。文件下载需要使用OutputStream将文件内容写入响应流,设置相应的文件名和内容类型,使浏览器正确识别进行下载文件删除可以通过File类来表示要删除的文件,并调用其delete()方法将文件删除。以上就是关于文件上传、下载和删除的一些基本信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值