我的网站允许用户上传个人资料图片,然后在网站周围以几种(约3或4种)不同的尺寸显示。
随着网站的增长,总是有可能需要调整图像尺寸,或者稍后需要新的图像尺寸。
像Facebook或Twitter这样的网站如何处理这个问题?他们是否在上传时将图像处理成不同的尺寸,或者是否存储了更高质量的图像并在需要时处理它们的服务器端?
有没有一种常用的方法可以解决这个问题?
答案 0 :(得分:4)
不同大小的图像很可能会在某处缓存,而不是每次都在访问时处理。上传时,您将创建所需的所有尺寸并存储它们(在文件或数据库中)。此方法使用最多的磁盘空间来存储所有图像大小,但在上载时放置所有处理负载,以便以后更快地访问。
或者,如果预计负载不重,您可以在访问这些尺寸的第一时间创建不同的尺寸,然后将其存储以备将来使用。因此,该方法仅通过创建实际使用的图像来使用较少的磁盘空间,但是在第一次使用图像大小时将禁止访问时间。未来的访问时间会很快,访问缓存的图像。
考虑在单独的工作服务器上执行图像处理。理想情况下,前端和工作服务器将共享上载和存储图像的存储装载,从而节省它们之间的传输带宽。在上载原件时,主应用程序将图像放在队列中以供工作人员处理。在处理之前,图像无法使用,但处理负荷仍然与前端无关,因此对最终用户体验没有太大的直接影响。
根据您每分钟预期的上传次数,工作进程可以像每分钟运行的cron作业一样简单,以轮询待处理的上传任务表(由主应用程序注册),执行转换和更新表格完成后。但是,如果一分钟太长而无法等待,则需要一个连续运行的工作进程来轮询新任务。显然,实施起来比较复杂。
无论您做什么,每次需要时都不要重新生成替代图像尺寸。把它们存放在某个地方。
答案 1 :(得分:2)
他们会在上传时将图片处理成不同的尺寸。
上传发生一次,观看可能会发生数千次。上传处理减少了服务器的工作。
答案 2 :(得分:1)
如果你想获得更好的结果:
在服务器上(从客户端)上传图像所需的最佳分辨率,并在图像中以较低的图像尺寸保存图像,并将这些图像字节数组保存在数据库中,如原始图像,原始图像缩略图和其他尺寸
仅将该图像发送到他真正想要显示的客户端,例如发送个人资料图片和图库视图的缩略图以及点击任何缩略图的原始图像。保持图像URL与缩略图和原始图像的相似程度。
答案 3 :(得分:0)
我的建议:
限制文件大小,分辨率和上传格式并存储原始图像。
或者:施加不太严格的限制,转换原始图像,存储转换后的图像而不是原始图像。
缩略图(大概)是最常访问的,并且(可能)是最小的,因此存储它们是有意义的。存储图像的尺寸与原始图像的1/5(或更小)相比几乎不显着。这些可以在上传时存储。
如果您不想存储所有其他大小的图像,可能会按顺序使用某种最近使用或最常用的缓存。使用图像唯一ID,每个大小的ID队列以及存储缓存图像的目录以及根据唯一ID和所需图像大小生成的文件名,这些应该相当简单。
如果所有其他图像尺寸的总和远小于原始图像尺寸(例如小于一半),那么仅存储所有图像尺寸并不是最糟糕的想法。
我确信找到一个开源的Java图像缩放器不会太费力。
ImageIO是一个体面但基本合理的图像处理API。不确定它是否可以调整大小。我发现它有一些缓存功能。