Tomcat通过文件路径URL下载自动重命名文件

最新在写毕业设计,涉及到下载重命名的功能,但是网上并没有JavaWeb的实现方案,经过多次搜索,只找到了nginx的方案。只好自己研究,分享出这篇博文。

为Tomcat添加文件下载功能

在Tomcat目录下的conf\Catalina\localhost里新建一个xml文件,这里我建立的是download.xml.
内容如下:

  
<Context  path="/download" docBase="F://filetemp" crossContext="true">  
Context>  

其中docBase是文件的真实目录。
path是url访问路径。

为Tomcat文件下载提供自动重命名功能

因为我们通常在服务器存储文件的时候是用md5或其他策略存储的,一方面是为了防止名字重复,另一方面是网盘等文件服务器要求有秒传功能,通常使用的是md5命名文件。当用户访问下载后得到的文件名是md5,所以需要重命名。这里我采用的是Filter+Http header实现的重命名。

  • 如何实现重命名
    Http header中存在一个Content-Disposition头。这个头可以实现下载文件时指定文件名的功能。
  • 如何给文件下载的响应头加上这个头信息
    因为我们的文件下载是Tomcat自己实现的,所以可以使用Filter拦截请求,在doFilter中添加头的方法。

怎么实现

写一个全局Filter。打成jar包,扔到Tomcat目录下lib文件夹中,并在Tomcat目录下conf文件夹中的web.xml里配置Filter。废话不说,直接上代码:

FileDownloadRenameFilter.java:

package com.lzp.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileDownloadRenameFilter implements Filter {
    /**
     * filter处理规则
     */
    String urlStartsWith = "";

    public FileDownloadRenameFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (((HttpServletRequest) request).getRequestURI().startsWith(urlStartsWith)) {
            String filename = request.getParameter("filename");
            if (filename != null && filename.length() != 0) {
                ((HttpServletResponse) response).setHeader("Content-Disposition",
                        "attachment;filename=\"" + filename + "\"");
            }
        }
        chain.doFilter(request, response);

    }

    public void init(FilterConfig fConfig) throws ServletException {
        this.urlStartsWith = fConfig.getInitParameter("urlStartsWith");
    }
}

conf/web.xml的 节点中添加:

    <filter>
        <filter-name>fileDownloadRenameFilterfilter-name>
        <filter-class>com.lzp.filter.FileDownloadRenameFilterfilter-class>
        <init-param>
            <param-name>urlStartsWithparam-name>
            <param-value>/downloadparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>fileDownloadRenameFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

其中param-value的值即为 download.xml中设置的path(记得前面有个/)

你可能感兴趣的:(JavaWeb)