0

我一直在尝试在上传时重命名我的图像,我发现的唯一一段代码是使用 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 知识非常有限,我到处寻找一个使用生成的随机数而不是哈希的示例,但没有成功。我最初的想法是获取数据库图像 ID 并将其用作上传时的图像文件名,但在此过程中我的大脑扭曲了。

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

任何帮助将不胜感激,非常感谢

==================================================== =============================== 好的,谢谢你的帮助埃里克,这是我到目前为止得到的,似乎工作得更好. 有什么办法可以让它连续吗?显然不使用 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); 
4

1 回答 1

1

根据对这个问题的回答,我建议如下:

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() 函数的说明,请参见此处

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

编辑

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

    function make_filename_hash($filename) {
      $info = pathinfo($filename);
      $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
      return uniqid() . $ext;
    }
于 2012-07-20T20:39:27.320 回答