在我的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。这个网络应用程序是用户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进程,它与部署war的文件夹相关联。它确实是由risdev运行的,他应该拥有对这些文件的权限。
编辑#2刚刚与在此服务器上安装tomcat的管理员确认。他确实使用risdev安装tomcat实例,并在安装后运行startup.sh。因此,tomcat肯定是由risdev拥有和运行的。在同一台服务器上,risdev绝对拥有访问该文件夹中文件的读取权限,这是由命令行(ls和less)确认的。只是当通过tomcat访问文件时,权限被拒绝了。

发布于 2016-09-17 14:56:33
检查下列条件:
作为参考,您可以使用以下命令检查正在运行的进程的所有者:
ps -ef 并利用grep缩小了结果。示例:
ps -ef |grep java如何更改文件夹及其内所有文件的所有者:
chown -R rizdev /rsrch1/rists/moonshot/data/prod/foundation/xml/https://stackoverflow.com/questions/39540000
复制相似问题