Изменение размера изображения при загрузке на сервер или при передаче с сервера на клиент?
Мой сайт использует много изображений. В слабый день пользователи будут загружать сотни новых изображений. Я пытаюсь понять, что является лучшей практикой для манипулирования размерами изображений.
Этот проект использует узел.js с модулем gm для манипулирования изображениями, но я не думаю, что этот вопрос относится к узлу или gm.
Я придумал несколько стратегий, но я не могу принять решение о том, какая из них лучшая, и я не уверен, что мне не хватает очевидной лучшей практики стратегия.
Пожалуйста, просвети меня своими мыслями и опытом.Вариант 1: изменение размера файла с помощью gm при каждом запросе клиента.
Вариант 1 Плюсы:
-
Если я запускаю функцию gm каждый раз, когда я обслуживаю файл, я могу контролировать размер, качество, сжатие, фильтры и так далее, когда мне это нужно.
-
На сервере я сохраняю только 1, full quality-полноразмерную версию файла и сохраняю место для хранения.
Вариант 1 минусы:
-
Gm очень ресурсоемкий, и это означает, что я буду злоупотреблять своей оперативной памятью для каждого отдельного сервера изображений для каждого отдельного клиента.
-
Это означает, что я всегда буду работать с большим файлом, что делает все еще хуже.
-
Мне всегда придется извлекать файл из моего хранилища (в моем случае S3) на сервер, затем манипулировать им, а затем обслуживать его. Похоже, это создаст избыточность проблемы с пропускной способностью.
Вариант 2: измените размер файла при первой загрузке и сохраните несколько размеров файла на сервере.
Вариант 2 Плюсы:
-
Мне придется использовать gm только для загрузки.
-
Обслуживание файлов не потребует почти никаких ресурсов.
Вариант 2 минусы:
-
Я буду использовать больше памяти, потому что я буду сохранять несколько версий одного и того же файла (т. е. полный, большой, medium, small, x-small) вместо одной версии.
-
Я ограничусь использованием только тех размеров, которые были созданы, когда пользователь загрузил свое изображение.
-
Не гибкий - если в будущем я решу, что мне нужна дополнительная версия размера (например, x-X-small), мне придется запустить скрипт, который обрабатывает каждый образ в моем хранилище, чтобы создать новую версию образа.
Вариант 3: Используйте опцию 2 только для обработки файлов При загрузке, но сохранить модуль изменения размера при обслуживании файлов, размеры которых не имеют сохраненной версии в моем хранилище.
Вариант 3 Плюсы:
- я смогу значительно сократить использование ресурсов при обслуживании файлов в наборе заданных размеров.
Вариант 3 минусы:
-
Я бы все равно взял больше памяти, как в Варианте 2 против варианта 1.
-
Мне все равно придется обрабатывать файлы, когда я их обслуживаю, в тех случаях, когда у меня нет файла размер я хочу
Вариант 4: я не создаю несколько версий файлов При загрузке. Я изменяю размер изображений, когда я их обслуживаю, но когда-либо размер изображения был запрошен, эта версия файла будет сохранена в моем хранилище, и для будущих запросов мне не придется обрабатывать изображение снова.
Вариант 4 Плюсы:
-
Я буду использовать хранилище только для тех версий, которые использую.
-
Я мог бы добавить новый размер файла, когда когда-либо я потребность, она будет автоматически создана на основе потребности, если она еще не существует.
-
Будет использовать много ресурсов только один раз на файл
Вариант 4 минусы:
- файлы, доступ к которым осуществляется только один раз, будут ресурсоемкимии . Потому что я получу доступ к файлу, увижу, что нужной мне версии размера не существует, создам новую версию файла, использую необходимые ресурсы и сохраню ее в своем хранилище. место для хранения файла, который будет использоваться только один раз (Примечание , я не могу знать, сколько раз файлы будут использоваться)
- я должен буду проверить, существует ли файл уже для каждого запроса.
Итак,
-
Что бы вы выбрали? Почему?
-
Есть ли лучший способ, чем тот, который я предложил?
1 ответ:
Решение сильно зависит от того, как вы используете свои ресурсы. Если у вас интенсивное использование, то вариант 2 гораздо лучше. Если нет, Вариант 1 также может хорошо работать.
С качественной точки зрения я думаю, что вариант 4, конечно, является лучшим. Но в вопросе простоты и автоматизации, я думаю, вариант 2 намного лучше.
Поскольку простота имеет значение, я предлагаю смешать вариант 2 и 4 : у вас будет список размера (например, большой, средний, маленький), но не будет обрабатывайте их при загрузке, но по запросу, как в варианте 4.
Так что в конце концов, в худшем случае вы придете к решению варианта 2.
Мое последнее слово будет заключаться в том, что вы также должны использовать объект
<img>
и/или<canvas>
на вашем веб-сайте для выполнения окончательного размера, чтобы небольшие вычислительные издержки не выполнялись на стороне сервера.