Что такое «обычный» способ обработки загруженных имен изображений? - PullRequest
1 голос
/ 23 марта 2011

Итак, я создаю веб-сайт с функцией загрузки изображений и сохраняю имя изображения в базе данных.Я сделал скриншот моего Mac и хотел загрузить это фото "Снимок экрана 2011-02-18 в 6,52.20 PM.png".Ну, это не очень хорошее имя для хранения в MySQL!Как люди обычно переименовывают фотографии таким образом, что каждая загружаемая фотография имеет уникальное имя?Кроме того, как мне убедиться, что я сохраню расширение файла в конце при переименовании фотографии.

Ответы [ 3 ]

5 голосов
/ 23 марта 2011

Я бы удалил расширение, иначе Apache (или его эквивалент) будет запускать a1e99398da6cf1faa3f9a196382f1fadc7bb32fb7.php по запросу (который может содержать вредоносный PHP). Я также загрузил бы это выше докрута.

Если вам нужно сделать изображение доступным поверх доку-корта, вы можете сохранить безопасную копию, которая запускается с помощью функций изображения, или использовать ее из некоторого PHP, например, с header('Content-Type: image/jpeg') и readfile() ( not include, потому что я могу встроить PHP в файл GIF).

Кроме того, pathinfo($path, PATHINFO_EXTENSION) - лучший способ получить расширение.

Убедитесь, что вы сохранили ссылку на этот файл с исходным именем файла и другими метаданными в базе данных.

function getUniqueName($originalFilename) {
    return sha1(microtime() . $_SERVER['REMOTE_ADDR'] . $originalFilename);
}

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

В качестве альтернативы, вы можете просто использовать basename($_FILES['upload']['tmp_name']), который PHP назначает при загрузке изображения. Я бы сказал, что он должен быть уникальным.

0 голосов
/ 23 марта 2011

Вы можете использовать таблицу изображений, например:

id: int
filename: varchar 
hash: varchar
format: enum('jpeg', 'png')

Хеш может быть чем-то вроде sha1_file($uploaded_file) и используется для того, чтобы убедиться, что дублирующиеся изображения не загружены.(Таким образом, вы можете иметь несколько записей в таблице изображений с одним и тем же хешем, если хотите.) Идентификатор полезен, так что вы можете иметь целочисленные ссылки на внешние ключи обратно на таблицу изображений.

Затем сохраните изображения вЛибо:

/image/$id.$format

или

/image/$hash.$format

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

/image/a/b/c/abcdef12345.jpg

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

Теперь вы можете напрямую ссылаться на эти файлы или настроить URL-адрес, например:

/image/$id/$filename

Например:

/image/12347/foo.jpg

foo.jpg происходит от того, что пользователь загрузил.Это на самом деле игнорируется, потому что вы смотрите через идентификатор.Тем не менее, изображение получит хорошее имя, если человек решит его скачать.(При желании вы можете проверить, что имя файла изображения совпадает после поиска идентификатора.)

Приведенный выше путь может быть переведен в image.php через Apache MultiView или ModRewrite.Затем вы можете readfile() или использовать X-SendFile (более высокая производительность, но не всегда доступная), чтобы отправить файл пользователю.

Обратите внимание, что если у вас нет X-SendFile и вы не хотитечтобы обрабатывать вещи через PHP, вы можете использовать RewriteRule для преобразования /image/$hash/foo.jpg в /image/a/b/c/$hash.jpg.

0 голосов
/ 23 марта 2011

Хэш имени изображения.Может быть md5, sha1 или даже unix timestamp.

Вот (непроверенный) пример со случайным числом (от 10 до 99)

<?php
function generate_unique_name($file_name)
{
    $splitted = split(".", $file_name);
    return time() . rand(10,99) . "." . $splitted[count($splitted)-1];
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...