我需要能够支持用户图片上传和下载/查看图片。
这是我的选择。
1)将图像存储在sql数据库中。
我已经看到这项工作用于小型设置。随着规模的增加,数据库成本会更高。 备份会更容易。无法利用缓存或CDN。
2)将图像存储在文件系统中。 我看到这个选项比一个小的设置稍大一些很麻烦。很难管理包含大量文件的目录。将不得不提出一些散列算法,以确保目录中有一些图像,目录只包含几个目录。不知道Windows中是否存在创建深层目录结构的限制。可以使用缓存。
3)将图像存储在nosql DB中。 把它扔到那里。我对NoSql不太熟悉。
4) Windows Azure存储/亚马逊存储。
一些事情。 1)金钱是一个重要因素。 2)windows是首选环境,但linux / apache解决方案还可以。
还有一件事。 Facebook会做什么?或者。 再次感谢。
答案 0 :(得分:2)
你应该采用混合解决方案。
将实际二进制图像存储在文件系统上,但使用数据库存储图像元数据。这为您提供了一个更简单的媒体来提供文件 - 允许可扩展性和提供服务的速度,同时还具有搜索,过滤等数据库的速度。
我已经看到了实现这个的各种方法..但通常它们是主键+ mime类型+目录绑定到文件名/文件夹。例如,/simon-whitehead/albums/stackoverflow/
目录中文件名为1013.jpg
的照片就像它在数据库中的表一样:
Id - 1013
Name - example.jpg
AlbumId - (Stackoverflow album id)
UserId - (my user id)
Lat - 37.81
Long - 144.96
Date - 7/10/2013
Mime type - image/jpeg
您甚至可能有一个将标签连接到图像的联结表(用于搜索)。然后,你基本上建立这样的响应:
file = getuser(userId).name / getalbum(albumId).name / getimage(imageid).name
编辑:我看到你现在添加了Azure。我会说我工作的一家公司使用Azure,他们有很棒的体验。然而,我没有太多机会看看..所以我不能就此给出任何建议。
答案 1 :(得分:0)
不要重新发明轮子。
Image Resizing for .Net几乎有你能想到的一切。缓存,云插件,API和庞大的社区+相关支持。
有多种方法可以优化性能,并且很容易从一个提供商切换到另一个提供商,比如S3到Azure;如果有机会,请查看该产品(它有一个nuget包)。
答案 2 :(得分:0)
如果您的项目不在Azure中,最好将文件保存在文件系统中。 但是,如果您的项目已经位于Azure中,那么您最好使用blob的容器来存储文件。 比较存储文件的位置:在数据库或文件系统中,答案是: 最好使用文件系统,因为它可以更快地运行,并且由于图像数量庞大,数据库也不会长大。