`
56553655
  • 浏览: 204255 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用于文件下载的Servlet

阅读更多

    今天在处理jar下载被IE自动将后缀修改为zip的时候,写了这么一个servlet;后面才发现原来是jboss中的mime.types中少了jar的配置,走了一大段弯路;这个Servlet在mime.types中即使没有配置的类型,大部份的浏览器都可以支持正常下载的,我的测试过程中使用七个浏览器,只有Opera在下载jar的时候会将其后缀恐怖的修改为exe。要使用这个Servlet,需要做的辅助工作就是要在web.xml中配置它,包括Servlet及servlet-mapping的配置,可参考以下内容:

   

<servlet>  
    <servlet-name>downloadServer</servlet-name>  
    <servlet-class>***.DownloadServlet</servlet-class>  
</servlet>  
<servlet-mapping>  
    <servlet-name>downloadServer</servlet-name>  
    <url-pattern>/download_center.do</url-pattern>  
</servlet-mapping>  

 

,下载文件的时候,将链接使用如下形式:

http://****.com/download_center.do?file=myfile.jar

 

,就可以调用该DownloadServlet进行文件的下载了,详细的可以参考一下网络上其它的资料,以下是DownloadServlet.java的完整源码:

/**
 * 类DownloadServlet.java的实现描述:TODO 类实现描述 文件下载Servlet
 * 
 * @author root 2010-7-28 上午11:25:58
 */
/**
 * 
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DownloadServlet extends HttpServlet {

    private static final long  serialVersionUID = 8228591081694973459L;
    protected final static Log logger           = LogFactory.getLog(DownloadServlet.class);

    /*
     * (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
     * javax.servlet.http.HttpServletResponse)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File path = new File("");
        String file = request.getParameter("file");// 通过该参数传入文件名
        if (!fileSafeCheck(file)) {
            StringBuilder sb = new StringBuilder("filename:").append(file).append(" is invalid");
            if (logger.isDebugEnabled()) {
                logger.debug(sb.toString());
            }
            response.setCharacterEncoding("gbk");
            response.setContentLength(sb.length());
            response.getWriter().write(sb.toString());
        }
        // 以下是文件名的完整路径,具体根据情况需要自己在这里处理一下了
        String filePath = path.getAbsoluteFile().getParent() + file;
        if (logger.isDebugEnabled()) {
            StringBuilder sb = new StringBuilder("filename:").append(file).append(",file absolute path:").append(
                                                                                                                 filePath);
            logger.debug(sb.toString());
        }
        if (filePath != null && filePath.length() > 0) {
            try {
                downloadFile(response, filePath);
            } catch (Exception e) {
                StringBuilder sb = new StringBuilder("download file exception,filename:").append(file).append(
                                                                                                              ",file absolute path:").append(
                                                                                                                                             filePath);
                logger.error(sb.toString(), e);
                sb.delete(0, sb.length());
                // sb.append("<script language=\"javascript\">alert('文件下载异常,请确定文件名是否正确.');</script>");
                sb.append("<script language=\"javascript\">alert('download file err.');</script>");
                response.setCharacterEncoding("gbk");
                response.setContentLength(sb.length());
                response.getWriter().write(sb.toString());
            }
        }
    }

    /*
     * (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
     * javax.servlet.http.HttpServletResponse)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
                                                                                   IOException {
        doGet(request, response);
    }

    /*
     * (non-Javadoc)
     * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
     */
    public void init(ServletConfig conf) throws ServletException {
        // TODO Auto-generated method stub
        super.init(conf);
    }

    /**
     * 下载文件
     * 
     * @param response
     * @param filePath
     * @throws RuntimeException
     * @throws IOException
     */
    private void downloadFile(HttpServletResponse response, String filePath) throws RuntimeException, IOException {
        File file = new File(filePath);
        if (!file.exists() || !file.canRead()) {
            throw new RuntimeException("File not exists or can not be read!");
        }
        FileInputStream fileinputstream = new FileInputStream(file);
        String filename = getFileName(filePath);
        downloadFile(fileinputstream, null, filename, 2048, response);
        fileinputstream.close();
        fileinputstream = null;
        file = null;
    }

    /**
     * 下载文件
     * 
     * @param filedata 下载数据流
     * @param contentType 文件类型
     * @param filename (下载后的)文件名称
     * @param buffersize 缓冲区大小
     * @param m_response
     * @throws IOException
     * @throws BimisException
     */
    private void downloadFile(InputStream filedata, String contentType, String filename, int buffersize,
                              HttpServletResponse m_response) throws IOException, RuntimeException {
        if (filedata == null) {
            return;
        }
        if (buffersize <= 0) {
            buffersize = 2048;
        }
        long contentLengh = filedata.available();
        if (contentType == null || contentType.length() == 0) {
            m_response.setContentType("application/x-msdownload");
        }
        else {
            m_response.setContentType(contentType);
        }
        if (contentLengh > 0) {
            m_response.setContentLength((int) contentLengh);
        }
        String m_contentDisposition = "attachment;";
        if (filename == null || filename.length() == 0) {
            m_response.setHeader("Content-Disposition",m_contentDisposition);
        }
        else {
            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + toUtf8String(filename));
        }
        ServletOutputStream rspout = m_response.getOutputStream();
        copyStream(filedata, rspout, buffersize, true);
    }

    /**
     * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
     * 
     * @param s 原文件名
     * @return 重新编码后的文件名
     */
    private String toUtf8String(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 0 && c <= 255) {
                sb.append(c);
            } else {
                byte[] b;
                try {
                    b = Character.toString(c).getBytes("utf-8");
                } catch (Exception ex) {
                    b = new byte[0];
                }
                for (int j = 0; j < b.length; j++) {
                    int k = b[j];
                    if (k < 0) k += 256;
                    sb.append("%" + Integer.toHexString(k).toUpperCase());
                }
            }
        }
        return sb.toString();
    }

    private final long copyStream(InputStream source, OutputStream dest, int bufferSize, boolean flush)
                                                                                                       throws RuntimeException {
        int bytes;
        long total;
        byte[] buffer;
        buffer = new byte[bufferSize];
        total = 0;
        try {
            while ((bytes = source.read(buffer)) != -1) {
                // Technically, some read(byte[]) methods may return 0 and we
                // cannot
                // accept that as an indication of EOF.
                if (bytes == 0) {
                    bytes = source.read();
                    if (bytes < 0) break;
                    dest.write(bytes);
                    if (flush) dest.flush();
                    ++total;
                    continue;
                }
                dest.write(buffer, 0, bytes);
                if (flush) dest.flush();
                total += bytes;
            }
        } catch (IOException e) {
            throw new RuntimeException("IOException caught while copying.", e);
        }
        return total;
    }

    /**
     * 根据传入的路径,获取文件的名称
     * 
     * @param fullFilePath
     * @return
     */
    private String getFileName(String fullFilePath) {
        if (fullFilePath == null) {
            return "";
        }
        int index1 = fullFilePath.lastIndexOf('/');
        int index2 = fullFilePath.lastIndexOf('\\');

        // index is the maximum value of index1 and index2
        int index = (index1 > index2) ? index1 : index2;
        if (index == -1) {
            // not found the path separator
            return fullFilePath;
        }
        String fileName = fullFilePath.substring(index + 1);
        return fileName;
    }

    /**
     * 文件名的安全检查,以免被人通过"../../../"的方式获取其它文件
     * 
     * @param filename
     * @return
     */
    private boolean fileSafeCheck(String filename) {
        if (filename.indexOf("../") >= 0) {
            return false;
        }
        return true;
    }
}

 

分享到:
评论

相关推荐

    文件上传与下载servlet

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

    servlet 文件上传下载例子

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

    servlet文件下载项目

    在这个"Servlet文件下载项目"中,我们利用Servlet技术来实现文件的下载功能。这是一个非常实用的功能,尤其对于那些需要向用户提供文件下载服务的网站或应用。 首先,我们需要了解Servlet的基本工作原理。Servlet是...

    java servlet实现文件下载

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

    文件上传下载servlet自用

    在IT行业中,文件上传下载是Web应用中常见的功能,尤其在服务器端编程中,Servlet扮演着重要的角色。Servlet是Java编程语言中用于扩展服务器功能的接口,它可以在接收到HTTP请求后进行处理,并向客户端返回响应。在...

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

    这个链接会指向一个`servlet`,由`servlet`来处理实际的文件读取和下载逻辑。 1. **创建Servlet**:首先,我们需要创建一个自定义的`servlet`,例如`FileDownloadServlet`。在`src`目录下的Java源代码文件中,我们...

    Servlet中文件上传和下载

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

    基于servlet的文件下载代码

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

    servlet实现文件上传下载

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

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

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

    jsp+servlet实现大型文件下载

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

    servlet上传下载文件

    Servlet技术广泛应用于文件上传和下载的功能实现,因为它们可以方便地与客户端交互并处理数据流。在本例中,我们将深入探讨如何使用Servlet来实现文件上传和下载功能。 首先,让我们了解文件上传的基本流程。当用户...

    jsp,servlet上传下载文件

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

    Servlet实现多文件批量下载

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

    Servlet文件下载

    ### Servlet文件下载技术详解 #### 一、Servlet简介与应用场景 Servlet是一种运行在服务器端的Java应用程序,主要用于处理客户端发送的HTTP请求,并响应相应的HTTP结果。Servlet是Java Web开发的基础,广泛应用于...

    jsp+servlet实现文件上传下载

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

    Servlet文件上传、下载及缩略图的生成

    Servlet是Java Web开发中用于处理HTTP请求的一种技术,它提供了服务器端编程的能力,可以处理用户的数据交互,如文件上传、下载以及图片处理等任务。在这个项目中,我们重点关注的是Servlet如何实现文件上传、下载和...

    servlet下载文件

    ### Servlet下载文件知识点详解 #### 一、Servlet简介与应用场景 Servlet是一种运行在服务器端的小程序,主要用于处理HTTP请求并生成动态网页。Servlet是Java Web开发的基础技术之一,广泛应用于构建动态网站和Web...

    答Servlet下载文件的附件

    这篇博客"答Servlet下载文件的附件"可能涉及了如何利用Servlet来实现文件的下载功能,让我们深入探讨这个话题。 首先,我们需要了解Servlet生命周期中的service()方法。当一个HTTP请求到达服务器,Servlet容器(如...

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

    本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,这对于任何Web应用程序来说都是至关重要的。 首先,我们来了解一下Servlet的基本概念。Servlet是Java编程语言中一个用于扩展服务器功能的接口,主要应用...

Global site tag (gtag.js) - Google Analytics