上传到服务器或从服务器提供给客户端时调整图像大小?

时间:2016-08-31 23:38:40

标签: node.js image-processing file-upload server-side resource-management

我的网站使用了很多图片。在疲惫的一天,用户将上传数百个新图像。 我试图弄清楚操作图像大小的最佳做法是什么。

这个项目使用带有gm模块的Node.js来处理图像,但我认为这个问题不是node或gm特有的。

我想出了几个策略,但是我无法决定哪个是最好的,而且我不确定我是否错过了一个明显的最佳实践策略。

请用你的想法和经验告诉我。

选项1:在每个客户端请求中使用gm调整文件大小。

选项1专业人士:

  1. 如果我每次提供文件时都运行gm函数,我可以在需要时控制大小,质量,压缩,过滤等等。

  2. 在服务器上我只保存1个全质量 - 文件的完整版本并节省存储空间。

  3. 选项1缺点:

    1. gm是非常耗费资源的,这意味着我会将每个图像服务器的RAM滥用到每个客户端。

    2. 这意味着我将永远在一个大文件中工作,这会让事情变得更糟。

    3. 我将始终从我的存储(在我的情况下为S3)中获取文件到服务器,然后操纵它,然后提供它。看起来它会产生冗余带宽问题。

    4. 选项2:在首次上传时调整文件大小,并在服务器上保留多种大小的文件。

      选项2专业人士:

      1. 我只需要在上传时使用gm。

      2. 提供文件几乎不需要任何资源。

      3. 选项2缺点:

        1. 我将使用更多存储空间,因为我将保存同一文件的多个版本(即完整版,大版,中版,小版,x小版),而不是仅保存一个版本。

        2. 我将仅限于使用用户上传图片时创建的尺寸。

        3. 不灵活 - 如果将来我决定需要一个额外的大小版本(例如xx-small),我将不得不运行一个脚本来处理我的存储中的每个图像以创建新版本的图像。

        4. 选项3: 使用选项2仅在上载时处理文件,但在提供存储中没有存储版本的文件大小时保留调整大小模块。

          选项3专业人士:

          1. 在提供一组设定大小的文件时,我将能够显着减少资源使用。
          2. 选项3缺点:

            1. 我仍然会在选项2和选项1中占用更多存储空间。

            2. 在我没有我想要的文件大小的情况下,当我提供文件时,我仍然需要处理文件

            3. 选项4:我不会在上传时创建多个版本的文件。当我提供图像时,我会调整图像的大小,但是当请求图像大小时,此版本的文件将保存在我的存储中,并且为了将来的请求,我将不必再处理图像

              选项4专业人士:

              1. 我只对我使用的版本使用存储空间。

              2. 我可以在需要时添加新的文件大小,如果它还不存在,它将根据需要自动创建。

              3. 每个文件只会使用大量资源

              4. 选项4缺点:

                1. 仅访问一次的文件将是资源密集型 AND 存储密集型。因为我将访问该文件,请查看我所需的大小版本不存在,创建新文件版本,使用所需资源,并将其保存到我的存储空间,浪费存储空间以查找仅使用一次的文件(< strong>注意,我不知道将使用多少次文件)
                  1. 我必须检查每个请求的文件是否已存在。
                2. 所以,

                  1. 你会选择哪个?为什么呢?

                  2. 有没有比我建议的方式更好的方法?

1 个答案:

答案 0 :(得分:0)

解决方案在很大程度上取决于您对资源的使用情况。如果你有一个密集的利用率,那么选项2就越好。如果没有,选项1也可以很好地工作。

从定性的角度来看,我认为选项4当然是最好的。但是对于简单和自动化的问题,我认为选项2更好。

因为简单性很重要,我建议混合选项2和4:你将有一个大小列表(例如大,中,小),但不会在上传时处理它们,但是在选项4中请求时。

最后,在最坏的情况下,您将到达选项2解决方案。

我的最后一句话是你应该使用你网站上的<img>和/或<canvas>对象来执行最终的大小调整,这样就不会在服务器端进行小的计算开销