Изменить размер изображения при загрузке на сервер или при передаче с сервера на клиент?

Мой сайт использует много изображений. В ненастный день пользователи будут загружать сотни новых изображений. Я пытаюсь выяснить, как лучше всего управлять размерами изображений.

Этот проект использует Node.js с модулем gm для управления изображениями, но я не думаю, что этот вопрос специфичен для узла или gm.

Я придумал несколько стратегий, но не могу решить, какая из них лучше, и не уверен, что упускаю очевидную передовую стратегию.

Пожалуйста, просветите меня своими мыслями и опытом.

Вариант 1. Изменяйте размер файла с помощью gm при каждом запросе клиента.

Плюсы варианта 1:

  1. Если я запускаю функцию gm каждый раз, когда обслуживаю файл, я могу контролировать размер, качество, сжатие, фильтры и т. д., когда мне это нужно.

  2. На сервере сохраняю только 1, полное качество - полноразмерная версия файла и экономия места на диске.

Минусы варианта 1:

  1. gm очень требователен к ресурсам, и это означает, что я буду злоупотреблять своей оперативной памятью для каждого отдельного сервера изображений для каждого отдельного клиента.

  2. Это означает, что я всегда буду работать с большим файлом, что еще хуже.

  3. Мне всегда придется извлекать файл из моего хранилища (в моем случае S3) на сервер, затем манипулировать им, а затем обслуживать его. Похоже, это создаст избыточные проблемы с пропускной способностью.

Вариант 2: измените размер файла при первой загрузке и сохраните несколько размеров файла на сервере.

Плюсы варианта 2:

  1. Мне нужно будет использовать gm только для загрузки.

  2. Обслуживание файлов практически не потребует ресурсов.

Минусы варианта 2:

  1. Я буду использовать больше памяти, потому что буду сохранять несколько версий одного и того же файла (т. е. полную, большую, среднюю, маленькую, x-small) вместо одной версии.

  2. Я буду ограничен использованием только тех размеров, которые были созданы, когда пользователь загрузил свое изображение.

  3. Не гибкий. Если в будущем я решу, что мне нужна версия дополнительного размера (например, x-x-small), мне придется запустить сценарий, который обрабатывает каждое изображение в моем хранилище, чтобы создать новую версию изображения.

Вариант 3. Используйте вариант 2, чтобы обрабатывать файлы только при загрузке, но сохраняйте модуль изменения размера при обслуживании размеров файлов, версия которых не сохранена в моем хранилище.

Плюсы варианта 3:

  1. Я смогу значительно сократить использование ресурсов при обслуживании файлов различных размеров.

Минусы варианта 3:

  1. Я бы все равно взял больше памяти, как в варианте 2, а не в варианте 1.

  2. Мне все равно придется обрабатывать файлы, когда я их обслуживаю, в случаях, когда у меня нет файла нужного размера.

Вариант 4. Я не создаю несколько версий файлов при загрузке. Я изменяю размер изображений при их подаче, НО всякий раз, когда запрашивается размер изображения, эта версия файла будет сохранена в моем хранилище, и для будущих запросов мне не придется снова обрабатывать изображение. .

Плюсы варианта 4:

  1. Я буду использовать хранилище только для тех версий, которые использую.

  2. Я мог бы добавить новый размер файла, когда мне нужно, он будет автоматически создан по мере необходимости, если он еще не существует.

  3. Будет использовать много ресурсов только один раз на файл

Минусы варианта 4:

  1. Files that are only accessed once will be both resource intensive AND storage intensive. Because I will access the file, see that the size version I need doesn't exist, create the new file version, use the resources needed, and save it to my storage wasting storage space for a file that will only be used once (note, I can't know how many times files will be used)
    1. I will have to check if the file already exists for every request.

Итак,

  1. Что бы вы выбрали? Почему?

  2. Есть ли лучший способ, чем способы, которые я предложил?


person Michael Seltenreich    schedule 31.08.2016    source источник


Ответы (1)


Решение сильно зависит от того, как вы используете свои ресурсы. Если у вас интенсивное использование, то вариант 2 намного лучше. Если нет, вариант 1 также может работать хорошо.

С качественной точки зрения я думаю, что вариант 4, конечно, лучший. Но с точки зрения простоты и автоматизации я думаю, что вариант 2 намного лучше.

Поскольку важна простота, я предлагаю смешать вариант 2 и вариант 4: у вас будет список размеров (например, большой, средний, маленький), но они будут обрабатываться не при загрузке, а по запросу, как в варианте 4.

Так что в итоге в худшем случае вы придете к варианту 2 решения.

Мое последнее слово будет заключаться в том, что вы также должны использовать объект <img> и/или <canvas> на своем веб-сайте для выполнения окончательного размера, чтобы небольшие накладные расходы на вычисления не выполнялись на стороне сервера.

person Antoine Bergamaschi    schedule 02.09.2016
comment
Мне нравится ваше мышление - person Michael Seltenreich; 04.09.2016