在 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 );