Как переименовать / сохранить изображения, загруженные в приложение электронной коммерции? - PullRequest
3 голосов
/ 23 февраля 2012

Я пишу свой первый интернет-магазин на PHP. Сейчас я работаю над формой «Добавить товар», и я не уверен, как хранить изображения.

Я думаю, что должен:

  1. проверьте это изображение или нет
  2. изменить размер изображения до "стандартных" размеров, используемых в моем магазине, и создать миниатюру
  3. создать уникальное имя файла и сохранить изображение в каталоге "images"
  4. сохранить изображение с уникальным именем файла и вставить строку в мою таблицу изображений

Я создал таблицу с такими столбцами:

  • Id
  • Местоположение - URL изображения - "/0953026326323436324.jpg", например
  • OriginalFilename - оригинальное имя файла, который загружал пользователь - например, «myproduct1.jpg»

Вопросы:

  1. Есть ли лучший способ сделать это?
  2. Должен ли я использовать идентификатор из таблицы изображений в качестве уникального имени файла, или я должен остаться с генерацией уникального имени (с помощью функции PHP)?
  3. Должен ли я сгенерировать хэш md5 и сохранить его в таблице изображений, чтобы избежать / обработать дубликаты?

Редактировать 2012-03-03: Под дубликатами я подразумеваю файлы с одинаковым содержимым (но, возможно, другим именем).

Я не использую никаких фреймворков, это будет простой и легкий онлайн-магазин.

Ответы [ 4 ]

1 голос
/ 02 марта 2012

Есть ли лучший способ сделать это?

Недавно я разработал нечто очень похожее, и этот подход сработал очень хорошо для меня, но это полностью зависит от вашего дизайна, целей, качества кода и т. Д.

Должен ли я использовать идентификатор из таблицы изображений в качестве уникального имени файла, или я должен остановиться на создании уникального имени (с помощью функции PHP)?

Я бы использовал идентификатор в качестве имени файла, поскольку он всегда уникален, это также означает, что вам не придется сохранять его в базе данных. Например; нужно изображение товара # 434? Это изображения / продукты / 434.jpg.

Должен ли я генерировать хэш md5 и сохранять его в таблице изображений, чтобы избежать / обработать дубликаты? Это хорошая функция, но в зависимости от количества изображений и дубликатов я не буду этого делать. Это добавляет ненужную сложность вашему коду с небольшими доходами. (Это, конечно, меняется, когда вы имеете дело с 1 Мб + изображений и 30% дубликатов, или с очень ограниченным / дорогим хранилищем)

Удачи!

1 голос
/ 02 марта 2012

Сначала проверьте файлы на стороне клиента.с чем-то вроде этого:

function (fileName) {
    var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';
    var allowed = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff'];

    if (!allowed.length) { return true; }

    for (var i = 0; i < allowed.length; i++) {
        if (allowed[i].toLowerCase() == ext) { return true; }
    }

    return false;
}

и на стороне сервера проверьте тип файла и измените его размер следующим образом:

Проверка изменения размера и расширения

используйте этот шаблон имени файла:

[ProductId] _ [Number] .ext

, например: 23_1.jpg и 23_2.jpg (если продукт имеет более одного изображения)

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

1 голос
/ 02 марта 2012

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

Сколько изображений? Если мы говорим о тысячах изображений, имейте в виду, что папка с таким количеством файлов, вероятно, недоступна через FTP. Вы можете классифицировать их и поместить их в разные подпапки, если вам нужен доступ к ним. Классификация может быть сделана несколькими способами ... от размера до нечетных / четных идентификационных номеров. Все зависит от того, сколько вам нужно разделить их.

Это личные изображения? Должны ли они быть общедоступными? Если вы используете только идентификатор в качестве уникального идентификатора, довольно легко угадать и найти другие изображения, так как они, скорее всего, автоинкрементные. В таких случаях вы можете создать более безопасное имя, просто выбрасывая идентификаторы пользователя, временные метки, случайные числа, хэш или любую другую комбинацию ...

Хэширование имен? Вы не получаете никакой дополнительной защиты от этого. Если вы уже используете комбинацию имен, хеширование - это просто дополнительная вещь. Скажем, вы используете [image_id] _ [timestamp] для имен, если вы их хешируете, вы потеряете эту информацию. У вас есть это в вашей базе данных, но также хорошо иметь это в именах файлов. Если по какой-либо причине вам необходимо удалить определенные файлы, было бы легче, если бы вы могли их распознать. И, возвращаясь к количеству изображений, которые у вас могут быть ... могут быть коллизии в MD5. Это означает, что 2 файла получат одно и то же имя (это действительно редко, но это может произойти)


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

Кстати, в соответствии с вашими пошаговыми инструкциями вы не можете использовать идентификатор изображения для имени файла, потому что вставляете строку в таблицу ПОСЛЕ сохранения изображения.

Если вам нужна дополнительная информация, оставьте комментарий.

1 голос
/ 29 февраля 2012

Вопросы:

  1. Есть ли лучший способ сделать это ?.
  2. Должен ли я использовать Id из таблицы изображений в качестве уникального имени файла или я останусь с генерацией уникального имени (с помощью функции PHP)?.
  3. Должен ли я генерировать хэш md5 и сохранять его в таблице изображенийчтобы избежать / обработать дубликаты?.

Ответы:

  1. Вы используете правильный путь.
  2. Да, вы должны использовать идентификатор таблицы изображений иливы можете сгенерировать уникальное имя с помощью идентификатора, например «id_filename» и т. д.
  3. , если вы можете сгенерировать уникальное имя для изображения, почему вы используете метод хеширования md5.
...