【发布时间】:2016-09-16 21:00:23
【问题描述】:
在我的 Web 应用程序中,我实现了一种在控制器中下载文件的方法:
@RequestMapping(
value = "/ristore/foundation/xml/{filename}",
method = RequestMethod.GET,
produces = "application/xml")
public ResponseEntity<byte[]> downloadXMLFile(@PathVariable String filename) throws IOException {
FileSystemResource xmlFile = new FileSystemResource("/rsrch1/rists/moonshot/data/prod/foundation/xml/" + filename + ".xml");
byte [] content = new byte[(int)xmlFile.contentLength()];
IOUtils.read(xmlFile.getInputStream(), content);
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("application/octet-stream"))
.contentLength(xmlFile.contentLength())
.body(content);
}
我在方法中硬编码了文件的路径。它是运行 Tomcat 实例的服务器上所有文件所在目录的路径。
我在tomcat服务器上部署了war。 Web 应用程序归用户 risdev 所有。
但是,当我尝试检索文件时,我得到了 500。在 catalina.out 中,它显示错误如下:
[/ristore/foundation/xml/TRF174146_09092016230414] due to exception [/rsrch1/rists/moonshot/data/prod/foundation/xml/TRF174146_09092016230414.xml (Permission denied)]
服务器管理员授予risdev 对该文件夹的访问权限。当我以risdev 登录服务器时,我可以毫无问题地读取该文件。
那为什么我没有权限通过 api 读取呢?实际获取文件的用户是谁?
编辑: 我找到了一个与部署我的战争的文件夹相关联的 tomcat 进程。它确实是由 risdev 运行的,他应该有权访问这些文件。
编辑 #2
刚刚与在此服务器上安装 tomcat 的管理员确认。他确实使用risdev安装tomcat实例并在安装后运行startup.sh。所以 tomcat 肯定是由risdev 拥有和运行的。在同一台服务器上,risdev 绝对具有访问该文件夹中文件的读取权限,这已通过命令行(ls 和更少)确认。只是通过tomcat访问文件时权限被拒绝。
【问题讨论】:
标签: rest tomcat permissions filesystems streaming