【问题标题】:rename files on upload in wordpress 3.4.1在 wordpress 3.4.1 中重命名上传文件
【发布时间】:2014-01-17 20:21:45
【问题描述】:

我一直在尝试在上传时重命名我的图片,我发现只有一段代码是使用 32char 散列的代码。

function make_filename_hash($filename) {
  $info = pathinfo($filename);
  $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
  $name = basename($filename, $ext);
  return md5($name) . $ext;
}
add_filter('sanitize_file_name', 'make_filename_hash', 10);

我的 php 知识非常有限,我到处寻找使用生成随机数而不是哈希的示例,但没有成功。我最初的想法是获取 db 图像 id 并将其用作上传时的图像文件名,但在此过程中我的大脑扭曲了。

无论如何,在这一点上,我会接受某种编号系统,每次上传时都会增加一位数,或者如果不可能,至少可以通过使用范围(如 rand(10000,99999))来增加一些随机数。

非常感谢任何帮助

================================================ =================================== 好的,感谢您的帮助 Eric,这是我到目前为止所得到的,并且似乎工作得更好。有什么办法可以让它连续吗?显然不使用 mt_rand :) 每次上传都会增加 1。也有可能两次生成相同的数字,因为这可能会在上传时产生问题。

function make_filename_hash($filename) {
  $info = pathinfo($filename);
  $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
  return mt_rand(10,10000) . $ext;
}
add_filter('sanitize_file_name', 'make_filename_hash', 10);

================================================ =================================== 你能从functions.php中的自定义表中读取数据并写入它吗?我正在尝试从表中读取一个计数器,将图像设置为该计数器编号并更新数据库中的计数器。它似乎不起作用,计数器增加但表永远不会更新,并且无论数据库中的值是什么,计数器都不会使用该值,因此这意味着它也没有读取该值。我只想知道是否有另一种方法可以重命名文件,但使用我的自定义表中的值。 这是我到目前为止所得到的。我在想也许我使用了错误的钩子,但在这一点上我有点卡住了。谢谢各位。

 function make_filename_counter($filename) {      
    $qry;
    $fcnt = 0;
    $sql = ("SELECT counter FROM bwbps_filenamecounter WHERE id = 1");
    $cnt = mysql_query($sql);
    foreach($cnt as $cnt) {
        $fcnt = $cnt->counter;
    }
    $fcnt = $fcnt + 1;
    $info = pathinfo($filename);
    $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
    $sql = "UPDATE bwbps_filenamecounter SET counter = " . $fcnt . " WHERE id = 1";
    $qry = mysql_query($sql);
    $fcnt = 0;
    return $fcnt . $ext;
}
add_filter('sanitize_file_name', 'make_filename_counter', 10); 

【问题讨论】:

    标签: php


    【解决方案1】:

    根据对this question 的回答,我建议如下:

    function make_filename_hash($filename) {
      $info = pathinfo($filename);
      $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
      $uniqueName = uniqid(basename($filename, $ext));
      return $uniqueName . $ext;
    }
    add_filter('sanitize_file_name', 'make_filename_hash', 10);
    

    这将使用原始文件名作为基础,然后附加一个时间敏感的标识符。有关 PHP 的 uniqid() 函数的说明,请参见 here

    我不肯定,但我相信 WordPress 会在将任何内容保存到数据库之前应用 sanitize_file_name 过滤器。如果是这种情况,您将无法将新名称绑定到数据库 ID。

    编辑

    要返回不包含原始文件名的唯一标识符:

        function make_filename_hash($filename) {
          $info = pathinfo($filename);
          $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
          return uniqid() . $ext;
        }
    

    【讨论】:

    • 这看起来很棒,它也确实有效,但我正在寻找一种解决方案来实际删除原始文件名并以某种方式通过使用随机生成器或其他方式控制最终结果,即数字/标识符连续系统,如果可能的话。但是,我将继续使用您的代码作为参考进行研究,也许我可以找到接近我需要的东西。非常感谢
    • 其他一些连续系统是什么意思?使用随机数不会得到连续的数字序列。如果文件名反映它们上传的顺序很重要,您可以简单地将文件名替换为文件夹/数据库中当前图像数量的计数。让我知道这是否能更好地描述您所追求的。
    • 是的,我的想法是按顺序而不是随机获取文件名,但我不知道这是否可能,因为我说我只是从 WP 和 php 开始。仍然用我数据库中当前图像数量的计数替换文件名不会反映我假设的新上传,对吧?也许我误解了,但我现在不太关心数据库中存在的任何内容,而是对新上传的文件将收到什么名称更感兴趣。
    • 谢谢,这太完美了! :)
    猜你喜欢
    • 2017-04-29
    • 2012-11-24
    • 2011-03-16
    • 2012-11-04
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多