【发布时间】:2017-01-08 16:38:34
【问题描述】:
我的网站使用了很多图片。在疲软的一天,用户将上传数百张新图片。 我正在尝试找出处理图像大小的最佳实践。
这个项目使用带有 gm 模块的 Node.js 来处理图像,但我不认为这个问题是特定于节点或 gm 的。
我想出了几个策略,但我无法决定哪个是最好的,而且我不确定我是否遗漏了一个明显的最佳实践策略。
请用你的想法和经验告诉我。
选项 1: 在每次客户端请求时使用 gm 调整文件大小。
选项 1 优点:
如果我每次提供文件时都运行 gm 函数,我可以在需要时控制大小、质量、压缩、过滤器等。
在服务器上我只保存 1,全质量 - 全尺寸版本的文件,节省存储空间。
选项 1 的缺点:
gm 非常占用资源,这意味着我将在每个单个图像服务器到每个单个客户端上滥用我的 RAM。
这意味着我将始终处理一个大文件,这让事情变得更糟。
我总是需要将文件从我的存储(在我的情况下为 S3)中获取到服务器,然后对其进行操作,然后提供它。似乎它会产生冗余带宽问题。
选项 2: 在首次上传时调整文件大小,并在服务器上保留多种大小的文件。
选项 2 优点:
我只需要在上传时使用 gm。
提供文件几乎不需要资源。
选项 2 的缺点:
我将使用更多存储空间,因为我将保存同一个文件的多个版本(即完整、大、中、小、x-small),而不是只保存一个版本。
我将仅限于使用用户上传图片时创建的尺寸。
不灵活 - 如果将来我决定需要一个额外大小的版本(例如 xx-small),我将不得不运行一个脚本来处理我存储中的每个图像以创建新版本的图像.
选项 3: 使用选项 2 仅在上传时处理文件,但在提供在我的存储中没有存储版本的文件大小时保留调整大小模块。
选项 3 优点:
- 在以选择的集合大小提供文件时,我将能够显着减少资源使用量。
选项 3 的缺点:
与选项 2 相比,我仍然会占用更多存储空间。
在我没有所需文件大小的情况下,我仍然需要在提供文件时对其进行处理
选项 4:我不会在上传时创建多个版本的文件。我在提供图片时确实会调整它们的大小,但是在请求图像大小时,此版本的文件将保存在我的存储中,并且对于未来的请求,我不必再次处理图像.
选项 4 优点:
我只会将存储用于我使用的版本。
我可以在需要时添加新的文件大小,如果它不存在,它将根据需要自动创建。
每个文件只会使用一次大量资源
选项 4 的缺点:
- 仅访问一次的文件将是资源密集型和存储密集型。因为要访问文件,看到我需要的size版本不存在,新建文件版本,使用需要的资源,保存到我的存储浪费存储空间的文件只用一次(注意,我不知道文件会被使用多少次)
- 我必须检查每个请求的文件是否已经存在。
那么,
你会选择哪个?为什么?
有没有比我建议的方法更好的方法?
【问题讨论】:
标签: node.js image-processing file-upload server-side resource-management