【问题标题】:Java, Tomcat 6: saving files to local HDJava,Tomcat 6:将文件保存到本地高清
【发布时间】:2011-04-23 15:55:45
【问题描述】:

我已经在网上搜索了一段时间(Google 和 StackOverflow),但还没有遇到这个问题。也许我的查询不正确(请重定向!)

我在 Linux 下的 TomCat 6 上开发并设置了一个 WebApp。 Tomcat 还没有在虚拟主机环境中运行,我可以完全控制服务器。因此,.war 文件被保存到 Tomcat 的标准部署目录。我遇到的问题是图像:不同的 Web 服务提供不同大小的图像,这些图像需要以统一的大小呈现。

我下载它们并调整它们的大小没有问题,但必须存储图像的本地副本,因为如果实时完成这需要一些时间,而且会浪费大量带宽。我不会将它们保存在 Tomcat 下的 .war 临时目录下,因为服务器关闭会迫使我重新加载所有图像。

我在 /home/username/images 下创建了一个不同的目录,然后我通过常规 Apache 在不同的子域下提供服务,在 .jsp 中生成的 HTML 代码只是文件的正确 URL。如果图像不存在,效果很好。但是,由于权限问题,Tomcat 实例无法删除或覆盖已创建的文件,即使我已将存储图像的文件夹标记为 777 权限。顺便说一句,我认为不需要给它 777 perms,但是对于 755(例如),即使在尝试保存新文件时我也会遇到权限问题。

那么:有没有更好的解决方案(我考虑过数据库,但图像目录现在是 250mb,我认为没有必要让数据库过载这么多)?

【问题讨论】:

  • 注意不先检查文件名就将文件保存到磁盘; theregister.co.uk/2010/10/06/net_voting_hacked
  • 感谢您的提醒!
  • 我实际上只是 md5(timestamp) 来获取文件名:) 不是优雅的名称,但通常确保它是唯一的。所以这里没有问题!

标签: java web-applications tomcat tomcat6


【解决方案1】:

不要将图像存储在数据库中。您的 /home/user/www.example.com/resources 方法方向正确,只需理清权限问题即可。确保路径在运行tomcat(tomcat?)的用户所属的组中,并减少777,因为它太宽了。

【讨论】:

  • 谢谢cherouvim。我不打算去 DB,我从不喜欢这种方法。 :) 我将不得不使用 Linux 权限,这就是我认为的问题所在。因此,将用户 tomcat(是的,正确的)添加到 /home/user/..../resources 的所有者组是正确的方法?此外,这个工作所需的最低权限是多少 - 644?还是755?再次感谢!
  • 是的,因为您希望它具有对该文件夹的读/写访问权限。确保中间的数字(代表一个组)具有读/写权限,所以 6 就可以了。
  • 在数据库中存储文件速度较慢,但​​有巨大的优势:数据库事务(ACID 属性)。当你把它存储在磁盘上时,你没有事务,例如当你保存数据,然后发生故障时,数据仍然存在于磁盘上(不会回滚),所以你必须处理如果对您来说不是重要问题,请手动或忽略。
  • 是的,确实如此。我权衡了这个选项,但已经序列化并在数据库中存储了一些其他对象(酒店详细信息通常是静态的),它占用了大约 100mb,并且不想进一步加载它(添加图像会增加很多SELECT 操作)。
【解决方案2】:

权限具体发生了什么? Tomcat 将以某个用户 ID(例如 tomcat1)运行,并将创建可能由同一用户(tomcat1)拥有的文件。如果您的文件是由不同的所有者创建的,那么这将解释为什么您不能覆盖现有下载,并且您需要找出所有权不同的原因。如果它不是所有权,那么是在没有用户写入权限的情况下创建的文件。在这种情况下,请考虑显式设置保存的每个文件的权限以允许所有者对其进行写入,或更改用户帐户的 umask。

【讨论】:

  • "或更改用户帐户的 umask。" -- 嗯,有趣的想法,谢谢!
【解决方案3】:

不清楚是tomcat和其他用户在写,还是只写tomcat。

如果只是tomcat,那么有问题的目录应该是tomcat所有的,权限可以是750(设置组匹配apache的组)或者755(组无所谓,本机任何人都可以)读取文件)。

请注意,如果其他用户正在写入文件,则您必须更加狡猾。在这种情况下,您需要 775、用户 tomcat、组 tomcat,并将其他用户放入 tomcat 组中。如果这些用户在多个组中,您可以使用目录上的组粘滞位来强制该组保留 tomcat。在这种情况下,机器上的任何人都可以读取这些文件。

chown 和 chmod 的文档应该会有很大帮助。

(是的,我确实意识到这个问题很老了,但同样的原则也适用,似乎没有人给出明确的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2019-03-31
    • 2019-03-11
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多