PHP: Как очистить загруженные имена файлов? - PullRequest
6 голосов
/ 21 сентября 2010

У меня есть приложение PHP.

Я разрешаю пользователям загружать файлы в мое веб-приложение.

Вопрос : Каков наилучший способ очистки файла?имена загруженных документов $_FILES["filename"]["tmp_name"] в PHP?

ОБНОВЛЕНИЕ :

Могу ли я взять MD5 загруженного имени файла и использовать его в качестве вновь назначенного имени файла?Если да, то как мне это сделать в PHP?

Ответы [ 6 ]

4 голосов
/ 21 сентября 2010

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

2 голосов
/ 21 сентября 2010

Чтобы избежать конфликта имен файлов, просто проверьте, не существует ли данное или созданное имя файла:

do {
   // Generate filename, eg.:
   $filename = md5(uniqid()) . $fileExtension;
} while (file_exists($filename));

Это дает вам 100% уверенность, что имя файла уникально. Использование md5 (или любого другого алгоритма хеширования) гарантирует, что имя файла является безопасным и простым в обращении.

2 голосов
/ 21 сентября 2010

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

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

РЕДАКТИРОВАТЬ: Чтобы избежать конфликтов имен файлов в каталоге, вы можете добавить md5 пользователей IP + текущее время к имени файла.

0 голосов
/ 17 ноября 2017

Чао, эта функция также удаляет все точки, а затем я создаю чистую строку с расширением.

function sanitaze_upload_file($data)
{
    $imgName   = $data;
    $indexOFF  = strrpos($imgName, '.');
    $nameFile  = substr($imgName, 0,$indexOFF);
    $extension = substr($imgName, $indexOFF);
    $clean     = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", 
    $nameFile);
    $NAMEFILE  = str_replace(' ', '', $clean).$extension;
    return $NAMEFILE;
}
0 голосов
/ 21 сентября 2010

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

move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));

Затем вы можете получить изображение из любого места (например, S3 или даже с вашего собственного сервера), просто знаяидентификатор пользователя.Вам даже не нужен атрибут в вашей базе данных для хранения URL изображений.

0 голосов
/ 21 сентября 2010

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

hash('md5', $_FILES["filename"]["tmp_name"]);
...