如何检查文件名是否有重复

时间:2018-05-18 18:25:08

标签: php wordpress function upload

我试图在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(++)。但我不知道如何在我的cheker中使用它。 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 :(得分:0)

您将不得不使用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;

答案 1 :(得分:0)

使用Unix日期+文件名+用户名+ uniqid的MD5哈希值。询问is_file文件是否存在。如果是这样,请增加哈希并再次检查。

或者,如果您的文件以某种方式在数据库中被引用,您可以使用database_id作为文件名。