这个PHP文件重命名代码有什么问题?

时间:2013-10-01 09:44:24

标签: php image file rename

以下代码用于遍历图像目录并重命名。

我让它运行良好,但我想添加的是文件开头的'静态'标记,一旦重命名,它将来会被忽略。

例如,假设我们有一个包含100个文件的目录。

前20个名称为“image-JTzkT1RYWnCqd3m1VXYcmfZ2nhMOCCunucvRhuaR5.jpg” 最后的80个名称为“FejVQ881qPO5t92KmItkNYpny.jpg”,这绝对是任何事情。

我想忽略已经重命名的文件(在文件名开头用'image-表示)

我该怎么做?

    <?php

function crypto_rand_secure($min, $max) {
        $range = $max - $min;
        if ($range < 0) return $min; // not so random...
        $log = log($range, 2);
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd >= $range);
        return $min + $rnd;
}

function getToken($length){
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    for($i=0;$i<$length;$i++){
        $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
    }
    return $token;
}



 $dir = "/path/to/images";
  if ( $handle = opendir ( $dir)) {
   echo "Directory Handle = $handles<br />" ;
   echo "Files: <br />" ;
    while ( false !== ($file = readdir($handle))) {
     if ( $file != "." && $file != ".." ) {
      $isdir = is_dir ( $file ) ;
       if ( $isdir == "1" ) {} // if its a directory do nothing
        else {
        $file_array[] = "$file" ; // get all the file names and put them in an array
        //echo "$file<br />" ;
        } // closes else
      } // closes directory check
     } // closes while
  } // closes opendir
 //Lets go through the array
 $arr_count = count( $file_array ) ; // find out how many files we have found so we can initiliase the counter
 for ( $counter=1; $counter<$arr_count; $counter++ ) {
  echo "Array = $file_array[$counter] - " ; // tell me how many files there are
  //$new = str_replace ( "C", "CIMG", $file_array[$counter] ) ; // now create the new file name
  $new =getToken(50);
  //if (substr($file_array[$counter]), 0, 3) == "gallery_image")
    //{

    //}
    //else
    //{
    $ren = rename ( "$dir/$file_array[$counter]" , "image-$dir/$new.jpg" ) ; // now do the actual file rename
    echo "$new<br />" ; // print out the new file name
    //}

  }
 closedir ( $handle ) ;
?>

2 个答案:

答案 0 :(得分:1)

对于应该非常微不足道的事情,你似乎正在做很多不必要的工作。

据我了解,您希望从目录中获取文件列表,并重命名所有尚未预先加载image-的文件。

您可以使用以下代码执行此操作:

$dir = "/path/to/dir/"; //Trailing slash is necessary or you would have to change $dir.$newname to $dir.'/'.$newname further down the code

if(is_dir($dir)){
    $dirHandle = opendir($dir);
    while($file = readdir($dirHandle)){
        if(is_file($dir.$file) === TRUE){
            if(strpos($file, 'image-') === 0)
                continue; //Skip if the image- is apready prepended
            while(TRUE){
                $cryptname = md5(mt_rand(1,10000).$file.mt_rand(1,10000)); //Create random string
                $newname   = 'image-'.$cryptname.'.jpg';                   //Compile new file name
                if(is_file($dir.$newname) === FALSE)                       //Check file name doesn't exist
                    break;                                                   //Exit loop if it doesn't
            }
            rename($dir.$file, $dir.$newname); //Rename file with new name
        }
    }
}

如果您想使用自己的功能,则可以更改以下行:

$cryptname = md5(mt_rand(1,10000).$file.mt_rand(1,10000));

使用您的功能代替md5。像:

$cryptname = getToken(50);

我建议您还应该检查文件名是否已经存在,否则可能 - 您可能会有覆盖文件的风险。


/images/ vs ./images/

首先,在处理网络时,您必须了解实际上有两个root目录。

Web根目录文档根目录。以示例网址http://www.mysite.com/images/myimage.jpg为例,就 web root 而言,路径名称为/images/myimage.jpg但是,从php您可以使用文档root 实际上是这样的:/home/mysite/pubic_html/images/myimage.jpg

因此,当您在php中键入/时,它认为您指的是home所在的目录。

./images/有效,因为./表示此目录,即脚本/ php所在的目录。

在您的情况下,您可能具有以下文件结构:

>/
  >home
    >public_html
      >images
        image-243.jpg
        image-243.jpg
      index.php

因为index.phpimages位于同一文件夹中:./images/等于/home/public_html/images/。另一方面,/表示home的父目录,其中没有图片文件夹,更不用说您要定位的目录。

如果你更习惯于把它想象成这样:在php /中意味着文档根目录(在类似C:\的窗口上)。

答案 1 :(得分:0)

您的文件名目录部分前面有'image-':

$ren = rename ( "$dir/$file_array[$counter]" , "image-$dir/$new.jpg" )

应该是

$ren = rename ( "$dir/$file_array[$counter]" , "$dir/image-$new.jpg" )