我使用的是Apache Tomcat 7,我有一个servlet,它列出了目录中的所有文件,并允许用户通过点击链接下载文件。
问题在于:
我在servlet中访问的文件不在项目目录中。它们位于tomcat目录本身之外的目录中
即
项目位于/opt/apache-tomcat-7.0.53 文件位于/ files /
中当我使用锚标签时,我无法使用href =""因为这假定目录在项目的WebContent文件夹中。
我尝试过href="file:///files/<FILE NAME>
,但我无法点击链接下载文件,所以一定有问题。
任何人都知道如何解决这个问题?
编辑:我还应该指出这不能在我的本地机器上运行。这是在服务器上。
答案 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可以访问服务器上的任何文件。 所以你基本上有两个解决方案:
在第二个解决方案中,您在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>