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


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

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

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

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

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

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

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

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

Вариант 1 минусы:

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

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

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

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

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

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

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

Вариант 2 минусы:

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

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

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

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

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

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

Вариант 3 минусы:

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

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

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

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

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

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

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

Вариант 4 минусы:

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

Итак,

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

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

1 2

1 ответ:

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

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

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

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

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