在java web应用程序中,我应该在哪里存储用户照片?

时间:2011-03-13 22:59:46

标签: design-patterns spring-mvc

这个问题可能很愚蠢,但我真的没有看到如何解决它: 免得说在我的应用程序中,我有一个用户。此用户编辑他的个人资料,需要编辑他的头像。

我应该在哪里存储头像文件? 首先,我将所有文件保存在src \ main \ webapp \ resources中,但每次重新部署该文件夹都会清空。

所以我决定放在另一个位置:c:\ wwwdir \ resources,but i can't link local resources from remote pages,所以我无法显示任何头像。

任何想法?建议?链路?

4 个答案:

答案 0 :(得分:7)

在提出解决方案之前需要考虑的事项:

  • 您是否会横向扩展您的webapp(即您将运行多个servlet容器实例)。
  • 您期待什么样的流量?
  • 图片需要多快更新一次(即在用户更改其头像后,他们和所有其他用户是否应立即看到新的头像)。

对于未横向缩放的webapp,您可以将文件系统用作图像存储。这很简单,易懂,而且有效。

对于横向缩放的webapp,您需要将图像存储在每个servlet容器可以到达的位置。这可能是一个数据库(我不推荐这个),S3(我推荐这个),或者一个内容库(我从未使用过其中一个)。 S3的一个优点是它可以很好地扩展。您可以将它放在CloudFront(亚马逊的CDN)之后,或者只是服务器脱离S3并保持服务器的负载。

您还在提问中提到您无法从远程客户端提供本地资源。这是正确的,有点......我猜你正在尝试使用像file://c:/.../image.jpg这样的网址。这不行。您需要做的是映射处理程序以提供图像。这可能看起来像

@RequestMapping(value = "/image/{name}.jpg", method = RequestMethod.GET)
public void image(@PathVariable("name") String name, HttpServletResponse response) {
    // Read the image from the file system using java.io
    // Write the image to the response output stream
    // Even better use org.springframework.utils.FileCopyUtils
}

答案 1 :(得分:3)

如何创建一个servlet,从您存储本地资源的任何地方读取本地资源,然后将其作为适当的内容类型流回来?因此,<img src="/resources/xyz.jpg"/>代替<img src="/resourceservlet?id=xyz.jpg"/>,而不是{{1}}。因此,您可以根据需要将文件存储在C:\ wwwdir \ resources文件夹中。

在网上搜索“java image servlet”会给你一些关于如何执行此操作的链接。您可以使用其中一个custom servlets或另一个响应中提到的使用框架的工具(如Spring)来构建。

您还可以考虑在Amazon S3中存储此类图形,但我不知道您正在构建的内容的规模。让servlet就位后,您可以移动内容而无需重做页面链接。

答案 2 :(得分:0)

尝试像Alfresco或Jackrabbit

这样的Java内容存储库

答案 3 :(得分:0)

普通老MySQL怎么样?

头像的另一个选择是使用gravatar.com(或类似的东西)。这种方法比将头像保留在内部更加现代和有效。