在我的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服务器上部署了战争。该网络应用由用户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和更少)确认)。只是通过tomcat访问文件时拒绝权限。
答案 0 :(得分:1)
检查以下条件:
作为参考,您可以使用以下命令检查正在运行的进程的所有者:
ps -ef
使用grep缩小结果范围。例如:
ps -ef |grep java
如何更改文件夹及其中所有文件的所有者:
chown -R rizdev /rsrch1/rists/moonshot/data/prod/foundation/xml/