2011-03-13 208 views
2

这个问题可能很愚蠢,但我真的不知道如何解决它: 唯恐在我的应用程序中说,我有一个用户。此用户编辑他的个人资料,并需要编辑他的头像。在Java Web应用程序中,我应该在哪里存储用户照片?

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

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

有什么想法吗?建议?链接?

回答

7

观光来到了一个解决方案之前考虑:

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

对于未水平缩放的web应用程序,可以使用文件系统作为图像存储。这很简单,可以理解,而且有效。

对于横向缩放的web应用程序,您需要将图像存储在每个servlet容器可以到达的位置。这可能是一个数据库(我不推荐这么做),S3(我推荐这个)或者一个内容仓库(我从来没有使用过其中的一个)。 S3的一个优势是它的规模很好。您可以将它放在CloudFront(亚马逊的CDN)之后,或者直接从S3服务器中卸载,并保持服务器的负载不变。

你也提到你的问题,你不能从远程客户端服务器本地资源。这是正确的,有点......我猜你正在尝试使用一些URL,如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 
} 
0

尝试像露天或兔崽子

一个Java内容仓库
+0

我检查了Jackrabbit,它看起来非常复杂,实现时间很长,找不到任何教程解释如何实现它与弹簧3 – 2011-03-14 13:25:26

+0

[在jackrabbit网站](http://jackrabbit.apache.org/jcr-client -application-howto.html)你有这3行代码片段。这并没有比这更容易。 – eddie 2011-04-08 19:21:44

3

如何创建一个servlet读取无论你已经保存在您的本地资源,只是流回来为适当的内容类型?所以,而不是<img src="/resources/xyz.jpg"/>你会有类似<img src="/resourceservlet?id=xyz.jpg"/>。因此,您可以根据需要将文件存储在C:\ wwwdir \ resources文件夹中。

在网上搜索“java image servlet”会给你一些链接,告诉你如何做到这一点。您可以使用其中一个custom servlets或者如另一个响应中提到的那样使用框架的功能(例如Spring)进行构建。

您也可以考虑将这些图形存储在Amazon S3中,但我不知道您正在构建的东西的规模。使用这个servlet可以让你移动内容而不必重做你的页面链接。

+0

你能告诉我更多关于这个解决方案吗?任何链接? – 2011-03-14 01:02:22

+0

@Stunaz编辑答案为您提供了一个适当示例的链接。 – 2011-03-14 13:31:10

0

如何平原旧MySQL

替身的另一种选择是使用gravatar.com(或类似的东西)。这种方法比保留头像更为现代和有效。

+0

thas是一个例子,如果用户有一张专辑照片? – 2011-03-14 13:14:43

相关问题