【问题标题】:Rename files during upload within Wordpress backend在 Wordpress 后端上传期间重命名文件
【发布时间】:2011-03-16 15:20:57
【问题描述】:

有没有办法在Wordpress 3.0 后端的上传过程中重命名文件?我希望文件命名一致,尤其是图像。

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

问候

【问题讨论】:

    标签: wordpress plugins file-rename


    【解决方案1】:

    您不能使用媒体库功能自动重命名文件。我建议在上传文件之前重命名文件。即使上传文件后,您也无法通过 WordPress 重命名它,只能通过 FTP。

    做到这一点的唯一方法是使用一个将自身连接到媒体库上传过程的插件。但是在上传文件之前这样做真的会更容易。

    【讨论】:

    • 感谢您的评论!我知道我不能用媒体库功能重命名它。这就是我问的原因 :) 对于这个项目,在上传进度中这样做会更容易。对于不熟悉批量重命名和 ftp 的人来说,这是一个可用性功能。
    【解决方案2】:

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

    对此不太确定 - 这似乎很容易;

    /**
     * @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() 把它砍掉一点。

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

    请注意,不存在文件覆盖的风险 - 如果新散列的文件与已存在的文件相同,WordPress 将尝试在文件名后附加一个递增数字,直到不再发生冲突。

    WordPress 插件

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

    【讨论】:

    • 感谢 TheDeadMusic,我想到了类似的东西。但希望有一个现成的插件或易于定制的东西,我不是编写 wordpress 插件或钩子的专家,但我会尝试的。进一步感谢您的建议。 stackoverflow 上很棒的家伙 :)
    • 我已经更新了我的答案 - 将代码保存在文件中为 hash-upload.php 并将其弹出到您的插件文件夹中:)
    • 这太棒了!我对此感到非常兴奋:) 目前我找到了自己的解决方案。我已经定制了上传+插件。也有效。但是您的解决方案要优雅得多。开销也更少。非常感谢 TheDeadMedic (notTheDeadMusic -sorry) 不能再次投票!
    • 我在这里问过-> stackoverflow.com/questions/3265350/…。为什么它也不改变 post_name 呢?如果我将插件优先级设置为 1,则相同。
    【解决方案3】:

    我真的在寻找一个可以正确完成的插件,最后我自己制作了这个。它可以在我的博客上找到:http://www.meow.fr/media-file-renamer!如果您使用它,请给我反馈:) 我真诚地希望它有所帮助!

    【讨论】:

      【解决方案4】:

      我实现了同样的东西,我想要一个比原始文件名更随机的文件名,因为我使用它的网站仅用于图片,所有文件都在一个目录中。

      我做了以下

      返回 md5($ip . uniqid(mt_rand(), true)) 。 $分机;

      【讨论】:

        【解决方案5】:

        我已经为它制作了一个插件。我这样做是因为我的客户尝试上传带有特殊字符的图像时遇到了太多麻烦

        http://wordpress.org/plugins/file-renaming-on-upload

        【讨论】:

          【解决方案6】:

          http://wpapi.com/change-image-name-to-wordpress-post-slug-during-upload/

          顺便说一句:

          sanitize_file_name添加过滤器是完全错误的,因为sanitize_file_name()函数是格式化字符串的辅助函数,它可以在插件或主题等其他地方使用。

          function wp_modify_uploaded_file_names($file) {
              $info = pathinfo($file['name']);
              $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
              $name = basename($file['name'], $ext);
          
              $file['name'] = uniqid() . $ext; // uniqid method
              // $file['name'] = md5($name) . $ext; // md5 method
              // $file['name'] = base64_encode($name) . $ext; // base64 method
          
              return $file;
          }
          
          add_filter('wp_handle_upload_prefilter', 'wp_modify_uploaded_file_names', 1, 1);
          

          【讨论】:

            猜你喜欢
            • 2012-11-24
            • 2017-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-21
            相关资源
            最近更新 更多