Как проверить имена файлов на предмет дублирования - PullRequest
0 голосов
/ 18 мая 2018

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

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

function new_upload_filename($filename, $filename_raw) {
    $info = pathinfo( $filename );
    $type = $info['extension'];
    if ( $type == 'jpg' || $type == 'jpeg' || $type == 'png' ) {
        $prefix = 'img_';
    } elseif ( $type == 'pdf' || $type == 'txt' || $type == 'docx' || $type == 'doc' || $type == 'xlsx' || $type == 'xls'  ) {
        $prefix = 'doc_';
    } elseif ( $type == 'mp4' || $type == 'avi' ) {
        $prefix = 'mov_';
    } elseif ( $type == 'gif' ) {
        $prefix = 'gif_';
    } else {
        $prefix = 'file_';
    }
    while ( $duplicatecheck ) {
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $rand = rand(11111,9999);
    $newname = $prefix . $rand . $ext;
    $duplicatecheck = // duplicate name checker (true if dublicate or false if not)
    return $newname;
} 
add_filter('sanitize_file_name', 'new_upload_filename', 10, 2);

Wordpress имеет встроенную функцию проверки, если имена дублируются, то дубликат получает суффикс -1 (++).Но я не знаю, как использовать его в моей чекер.https://developer.wordpress.org/reference/functions/wp_unique_filename/

Спасибо.

UPD:

Готов.

do {
$ext = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
$rand = rand(11111,9999);
$newname = $prefix . $rand . $ext;

    $upload_dir = wp_get_upload_dir();
    $namecheck =  is_file( $upload_dir['path'] . DIRECTORY_SEPARATOR . $newname );

} while ( $namecheck );

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Используйте MD5-хэш Unix Дата + имя файла + имя пользователя + uniqid.Спросите is_file, существует ли файл.Если это так, увеличьте ваш хеш и проверьте снова.

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

0 голосов
/ 18 мая 2018

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

Почему бы просто не сгенерировать более линейное имя файла, используя что-то вроде текущей временной метки Unix, чтобы снизить риск возникновения коллизий, пока они именуются?

$newname = $prefix . time() . $ext;

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

 $newname = $prefix . get_current_user_id() . time(). $ext;

Или, если вы пытаетесь немного запутать ее, просто запустите ее через базовый хеш, такой как md5.

$hash = md5( get_current_user_id() . time() );
$newname = $prefix . $hash . $ext;
...