访问Tomcat上的本地文件

时间:2014-05-29 20:43:33

标签: java tomcat servlets

我使用的是Apache Tomcat 7,我有一个servlet,它列出了目录中的所有文件,并允许用户通过点击链接下载文件。

问题在于:

我在servlet中访问的文件不在项目目录中。它们位于tomcat目录本身之外的目录中

项目位于/opt/apache-tomcat-7.0.53 文件位于/ files /

当我使用锚标签时,我无法使用href =""因为这假定目录在项目的WebContent文件夹中。

我尝试过href="file:///files/<FILE NAME>,但我无法点击链接下载文件,所以一定有问题。

任何人都知道如何解决这个问题?

编辑:我还应该指出这不能在我的本地机器上运行。这是在服务器上。

3 个答案:

答案 0 :(得分:3)

你可能最好不要看Tomcat Aliases。它们允许您将外部目录安装到Web应用程序的上下文中,并让Tomcat直接为该文件提供服务。

附录:

:之前的网址部分称为&#34;方案&#34;。示例包括&#34; http&#34;,&#34; https&#34;,&#34; ftp&#34;以及&#34;文件&#34;。

该计划告诉浏览器&#34;做什么&#34;使用URL的其余部分,不同的方案可以在:之后具有不同的格式。

因此,以file://开头的网址使用&#34;文件&#34;方案。文件方案告诉浏览器尝试打开其余URL指定的文件名。该文件名是LOCAL文件名。本地浏览器。不是服务器。

您几乎不会在基于服务器的应用程序上使用file://类型的URL,而只能在客户端应用程序上使用。

答案 1 :(得分:0)

Tomcat本身只能提供WebContent目录中的文件,而不能提供WEB-INF中的文件。但是servlet可以访问服务器上的任何文件。 所以你基本上有两个解决方案:

  • 在WebContent下链接外部目录是否导致没有安全问题,以及Tomcat是否接受遵循符号链接(假设Unix下的服务器如Linux系统)
  • 通过构建伪目录列表和提供文件来明确地在WebApplication中进行转换

在第二个解决方案中,您在servlet域中选择一个任意根URL,例如http:server.domain.org/app/path/to/files。文件目录不存在于WebContent下,但您必须有一个控制器响应http:server.domain.org/app/path/to/files/myfile.ext之类的URL,并直接在外部目录下提供相同名称的文件。

这第二个解决方案要复杂得多,但对通过应用程序真正可访问的内容提供了最大程度的控制。恕我直言,如果您有安全需求或必须进行特殊操作,您应该只使用它。我已经使用它来完全控制需要相对于业务URL上传和下载文件的应用程序。

答案 2 :(得分:0)

您应该使用 javax.servlet.Filter 界面。

public class ResourceProxyFilter implements Filter {

    private static final String PROXY_CONTROLLER_PREFIX = "/proxyFilter/";

    @Override
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException {
        String requestURI = getRequestURI(request);

        File requestedResource = getRequestedResource(requestURI);
        sendResponse(response, requestedResource);
    }

    private String getRequestURI(ServletRequest request) {
        HttpServletRequest httpRequest = (HttpServletRequest) request;

        return httpRequest.getRequestURI();
    }

    private File getRequestedResource(String requestURI) {
        String requestedResourcePath = requestURI.substring(requestURI.indexOf(PROXY_CONTROLLER_PREFIX) + PROXY_CONTROLLER_PREFIX.length());
        File dirWithYourFiles = new File("/files");

        return new File(dirWithYourFiles, requestedResourcePath);
    }

    private void sendResponse(ServletResponse response, File requestedResource) throws IOException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        ServletOutputStream writer = httpResponse.getOutputStream();
        writer.write(ByteStreams.toByteArray(new FileInputStream(requestedResource)));
        writer.flush();
        writer.close();
    }
}

然后你必须将你的过滤器添加到web.xml:

<filter>
    <filter-name>resourceProxyFilter</filter-name>
    <filter-class>eu.company.ResourceProxyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>resourceProxyFilter</filter-name>
    <url-pattern>/proxyFilter/*</url-pattern>
</filter-mapping>