任何类型的文件下载时都会弹出文件保存框的实现

时间:2021-07-19 21:00:49


从事WEB程序设计的朋友一定都遇到过这种情况吧,对于一些操作系统可以识别的文件类型如果直接给出文件的链接地址,浏览器就会自动调用相关程序来打开该文件,比如.doc、.txt、.html等等,还有一点这样就会把文件直接暴露给用户,不利于文件的保密工作。所以有必要提供一种方法来改善这种情形,本人通过实践找到了一种方法,希望大家一起探讨一下。

实验环境:

Ø  平台:Windows 2000 Advanced Server
Ø  WEB服务器:TOMCAT4.0.4
Ø  JDK:JDK1.3.1

实现方法:

  本人是从事JAVA开发的,所以尝试使用SERVLET来实现该功能,现将代码贴于下面,以供大家参考

package com.timeschina.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.timeschina.common.*;

/**
* <p>Title: 文件下载Servlet</p>
* <p>Description: 文件下载Servlet</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: Tiger, Ltd.</p>
* @author TIM
* @version 1.0
*/

public class DownloadServlet extends HttpServlet
{
static final private String CONTENT_TYPE = "text/html; charset=GBK";
//Initialize global variables
public void init() throws ServletException
{
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html; charset=gb2312");
HttpSession session = request.getSession();
//要下载的文件名
    //之所以这样处理,主要是因为文件名的中文化问题,这样处理的话,中文文件名也会正常显示
String downloadfile = new String((request.getParameter("downFile")).getBytes("iso8859-1"), "gb2312");

    ServletContext context = getServletContext();
ServletConfig config = getServletConfig();

    //获取要下载文件所在的目录,这里是对应于服务器上的物理路径
    //目录的格式是这样的:
    // 根目录(WEB主目录所对应的实际物理目录)
    //+虚拟目录(下载文件存放的子目录)
downloadpath = context.getRealPath(File.separator)
           + config.getInitParameter("downloadPath")
           + File.separator;
    //构建下载文件的对象
java.io.File file = new java.io.File(downloadpath + downloadfile);
    //获得文件的长度
long filesize = file.length();
    //设置输出格式
response.addHeader("content-type", "application/x-msdownload;");
response.addHeader("Content-Disposition", "attachment; filename=" + response.encodeURL(downloadfile));
response.addHeader("content-length", Long.toString(filesize));
    //向客户端写入文件
java.io.FileInputStream fin = new java.io.FileInputStream(file);
byte[] b = new byte[1];
int j = 0;
while((j = fin.read(b)) > 0)
{
response.getOutputStream().write(b);
}
fin.close();
}

  //Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
}

  //Clean up resources
public void destroy()
{
}
}

下面是SERVLET配置文件WEB.XML中的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>com.timeschina.servlet.DownloadServlet</servlet-class>
  <init-param>
    <param-name>downloadPath</param-name>
    <param-value>download</param-value>
  </init-param>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>20</session-timeout>
</session-config>
</web-app>

下面是调用该SERVLET的例程
<a href=”servlet/DownloadServlet?downFile=test.zip”>测试</a>

注意:test.zip文件必须存在于WEB服务器主目录下的download目录下!!!

总结:

  通过这种方法无论什么类型的文件当用户左键单击文件时,都会弹出另存为的对话框显示给用户。