
tomcat 无法下载 pdf 文件(显示“failed - no file”)通常是因为文件未放在 web 应用的可访问路径下;正确做法是将 `brochure.pdf` 放入 `webapps/root/` 目录(与 jsp 页面同级),并通过相对路径 `/brochure.pdf` 引用。
在 Tomcat 中,只有部署在 Web 应用根目录(如 webapps/ROOT/)及其子目录下的资源,才能被客户端直接访问和下载。WEB-INF/ 及其上级目录(如 ../ 或 ../../)属于受保护区域,所有内容均被 Tomcat 显式禁止外部访问——这是安全设计,不是路径错误,而是强制限制。
你当前的路径逻辑存在两个关键问题:
- ❌ 尝试从上下文根(如 /myapp)下查找 brochure.pdf,但实际文件却放在 webapps/brochure.pdf(即 Tomcat 安装目录根下),该路径完全不在任何 Web 应用的资源范围内,Tomcat 不会服务它;
- ❌ ROOT/WEB-INF/../../contactUs.jsp 这种写法试图跨出 Web 应用边界定位 JSP,不仅违背 Tomcat 部署规范,且 contactUs.jsp 若真在此位置,根本无法被容器编译执行。
✅ 正确做法如下:
将 brochure.pdf 移至 Web 应用根目录:
复制文件到 TOMCAT_HOME/webapps/ROOT/brochure.pdf(确保与 about-us.jsp、careers.jsp 等处于同一层级)。-
更新 HTML 中的链接为上下文无关的根路径:
- User Guide
-
(可选)增强兼容性与语义:
添加 type="application/pdf" 和明确的 download 文件名,提升浏览器识别率: - User Guide (PDF)
✅ 使用 /brochure.pdf(以 / 开头的绝对路径)比 ${pageContext.request.contextPath}/brochure.pdf 更简洁可靠——因为 ROOT 应用的上下文路径即 /,二者等价;且避免因动态表达式渲染异常导致路径错误。
⚠️ 注意事项:
- 不要将 PDF 放在 WEB-INF/、META-INF/ 或其任意父级目录中——这些路径对 HTTP 请求完全不可见;
- 避免使用 .. 路径跳转(如 ../../brochure.pdf),Tomcat 会拒绝解析或返回 404;
- 若项目使用 Maven 构建,应将 brochure.pdf 放入 src/main/webapp/ 下,确保打包进 WAR 文件的根目录;
- 浏览器“Failed - No file”提示通常意味着服务器返回了空响应或 404/403,可通过浏览器开发者工具的 Network 标签页 查看具体请求状态码和响应头,快速定位是否为路径 404 或 MIME 类型问题。
完成上述调整后,重启 Tomcat(或等待热部署生效),点击下载链接即可正常获取 PDF 文件。这是 Tomcat 静态资源服务的基础实践,也是 Java Web 工程部署的标准化要求。










