在Wordpress后端上传期间重命名文件

问题描述:

是否可以在Wordpress 3.0后端的上传过程中重命名文件?我想对文件进行一致的命名,尤其是对于图像.

is there a way to rename files during the upload progress within the Wordpress 3.0 backend? I would like to have a consistent naming of files, especially for images.

我认为原始文件名的12(+-)位哈希值或类似的值会很棒.有什么建议吗?

I think an 12 (+-) digit hash value of the original filename or something similar would be awesome. Any suggestions?

致谢

但是在上传文件之前这样做确实会更容易.

But it would really be easier to do that before uploading files.

对此不太确定-这似乎很简单;

Not quite sure about that - this seems fairly easy;

/**
 * @link http://stackoverflow.com/a/3261107/247223
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );

此过滤器创建原始文件名的32个字符的哈希,保留文件扩展名.如果需要,可以使用substr()将其切碎.

This filter creates a 32 character hash of the original filename, preserving the file extension. You could chop it down a little using substr() if you wanted to.

该过滤器在文件上载到服务器上的临时目录之后,但在调整大小(如果适用)并保存到上载文件夹之前运行.

This filter runs once the file has been uploaded to a temporary directory on your server, but before it is resized (if applicable) and saved to your uploads folder.

请注意,没有文件被覆盖的风险-如果新散列的文件与已经存在的文件相同,则WordPress将尝试在文件名后附加一个递增的数字,直到不再存在冲突为止.

Note that there is no risk of file overwrite - in the event that a newly hashed file is the same as one that already exists, WordPress will try appending an incrementing digit to the filename until there is no longer a collision.

<?php

/**
 * Plugin Name: Hash Upload Filename
 * Plugin URI:  http://stackoverflow.com/questions/3259696
 * Description: Rename uploaded files as the hash of their original.
 * Version:     0.1
 */

/**
 * Filter {@see sanitize_file_name()} and return an MD5 hash.
 *
 * @param  string $filename
 * @return string
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );