2015-11-04 3 views
-1

Вот мой код загрузки функции:Как переименовать автоматически имена файлов изображений во время загрузки?

function upload(&$file, $destinationDir = "", $destinationName = "", $secure = true){ 
    $ret = false; 
    if (isset($file['tmp_name']) && isset($file['name'])){ 
     if ($destinationName == ''){ 
      $destinationName = $file['name']; 
     } 

     $destinationFile = $destinationDir . '/' . $destinationName; 
     if (move_uploaded_file($file['tmp_name'], $destinationFile)){ 
      if ($secure){ 
       chmod($destinationFile, 0644); 
      } 

      $ret = true; 
     } 
    } 

    return $ret; 
} 

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

Как я могу изменить эту функцию, чтобы автоматически переименовывать файлы при загрузке на сервер?

Большого спасибо

+1

Вы пробовали изменения '$ destinationName' на что-то другое, чем' $ файла [ ​​'имя'] '? – Ben

+0

Переименуйте, что именно? Совет. Использование 'sha1_file()' для генерации имени файла - довольно хорошая идея. – deceze

+0

@deceze - почему бы не [tempnam] (http://php.net/tempnam), который существует именно для таких целей? Не нужно слишком много болтать, пусть ОС выполняет свою работу ^.^ – Mjh

ответ

1

Получить расширение:

//Get extension 
$ext = pathinfo($file["name"], PATHINFO_EXTENSION); 

Затем изменить эту строку:

$destinationName = $file['name']; 

в комбинацию sha1 хэша файла, приложенной к временным меткам, с расширением:

$destinationName = sha1_file($file["tmp_name"]).time().".".$ext; 
+1

Не то, чтобы вы использовали '$ file ['name']' unsanitised для начала ... – deceze

+1

Я сделал это, но если имя файла test.jpg, оно изменит имя на что-то вроде этого test.jpg1446651332 –

+0

See мой обновленный ответ. – Ben

0

использовать что-то вроде этого:

$destionationFile = $destinationDir . '/' . $destinationName; 
if(is_file($destinationFile)) 
{ 
$destinationName = basename($destinationName).'_'.hash('sha256', time().rand(9999, 999999)).'.'.pathinfo($destinationName)['extension']; 
$destionationFile = $destinationDir . '/' . $destinationName; 
} 
+0

Что делать, если один и тот же файл (одно имя) загружается дважды в течение одной секунды? * Вряд ли *, предоставлено, но не невозможно. Чем популярнее ваш сайт, тем больше он становится. – deceze

+0

ну, после моего редактирования он должен работать @deceze – Evolutio

+1

Мех .......... вы сделали это * еще менее вероятно *, да; это, вероятно, будет на практике. Тем не менее, вы должны * действительно использовать фактическую случайность вместо этого интенсивного инкрементного добавления энтропии. UUID, например, для 'openssl_random_pseudo_bytes()'. – deceze

Смежные вопросы