PHP - 循环文件夹,打开每个docx文件并替换字符串

时间:2016-05-13 15:28:07

标签: php zip docx scandir

我有一个脚本:

  • 浏览我的" ./ sample /"的每个文件夹和子文件夹。目录
  • 打开每个.docx文件
  • 替换" ## PROPERTY ##"等字符串。使用我的$ _POST ['属性']变量
  • 拉链文件夹内容
  • 启动下载

现在,单独运行部分代码,它可以满足需要。但是,当将它们放在一起时,它会在扫描子文件夹以查找docx文件时死亡。

我的文件夹结构如下:

./样品/

  • /IT/it1.docx
  • /F&B/fb1.docx
  • /FO/fo1.docx
  • sample1.docx

问题似乎发生在1级文件夹的is_dir($ dir)部分。 有什么想法会导致这种情况吗?

    <?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {

    // form variables
    $holidex = strtoupper($_POST['holidex']);
    $property = $_POST['property'];
    $brand = $_POST['brand'];
    $division = $_POST['division'];
    $language = $_POST['language'];
    $date_issued = $_POST['date_issued'];
    $approved_by = $_POST['approved_by'];

    // script variables
    //$dir = './Sample_SOP_-_'.$brand.'_('.$language.')';   //dir to scan like ./sample/
    $dir = './sample/';                                     //dir to scan like ./sample/
    $archive = date("Y-m-d H-i-s");                         //UNIQUE name of zip file to create and download
    $zipfile = "./".$holidex." - ".$archive.".zip";         //path to zip file download
    $temp = "./temp/";                                      //directory to temp folder

    // string replacements
    $find = "##PROPERTY##";                                 // find and replace property information
    $replace = $_POST['property'];

    $find2 = "##BRAND##";                                   // find and replace brand information
    $replace2 = $_POST['brand'];

    $find3 = "##DATE##";                                    // find and replace effective date
    $replace3 = $_POST['date_issued'];

    $find4 = "##APPROVED_BY##";                             // find and replace approved by
    $replace4 = $_POST['approved_by'];

    //read dir
    $files = scandir($dir, 1);

    //create new archive name
    $zip_download = new ZipArchive();
    $zip_download->open("$zipfile", ZipArchive::CREATE);

    foreach($files as $file) {

      //docx
      $ext1 = ".docx";
      $checkextension = explode($ext1, $file);
      if (count($checkextension) > 1) {
        $zip = new ZipArchive;
        $zip->open("$file");

        $word = $zip->getFromName('word/document.xml');
        $word2 = str_replace($find, $replace, $word);
        $word2 = str_replace($find2, $replace2, $word);
        $word2 = str_replace($find3, $replace3, $word);
        $word2 = str_replace($find4, $replace4, $word);

        $zip->addFromString("word/document.xml", $word2);
        $zip->close();
      } else {
            die("Error - There are no files the directory..");
            }

      //folders level 1
      if (is_dir($file)) {
        $sub = $file . '/';
        $subfiles = scandir($sub, 1);
        if ($subfiles > 1) {
          if ($sub == "../" || $sub == "./") {
          }
          else {
            foreach($subfiles as $subfile) {

              //docx
              $ext1 = ".docx";
              $checkextensionsub = explode($ext1, $subfile);
              $subsubfile = $sub . $subfile;
              if (count($checkextensionsub) > 1) {
                $zipsub = new ZipArchive;
                $zipsub->open("$subsubfile");

                $wordsub = $zipsub->getFromName('word/document.xml');
                $word2sub = str_replace($find, $replace, $wordsub);
                $word2sub = str_replace($find2, $replace2, $wordsub);
                $word2sub = str_replace($find3, $replace3, $wordsub);
                $word2sub = str_replace($find4, $replace4, $wordsub);

                $zipsub->addFromString("word/document.xml", $word2sub);
                $zipsub->close();
              }

              //folders level 2
              $sub2 = $sub . $subfile;
              if (is_dir($sub2)) {
                $subfiles2 = scandir($sub2, 1);
                if ($subfiles2 > 1) {
                  if ($sub2 == $sub.".." || $sub2 == $sub.".") {
                  }
                  else {
                    foreach($subfiles2 as $subfile2) {
                      //docx
                      $ext1 = ".docx";
                      $checkextensionsub2 = explode($ext1, $subfile2);
                      $subsubfile2 = $sub2 . '/' . $subfile2;
                      if (count($checkextensionsub2) > 1) {
                        $zipsub2 = new ZipArchive;
                        $zipsub2->open("$subsubfile2");

                        $wordsub2 = $zipsub2->getFromName('word/document.xml');
                        $word2sub2 = str_replace($find, $replace, $wordsub2);
                        $word2sub2 = str_replace($find2, $replace2, $wordsub2);
                        $word2sub2 = str_replace($find3, $replace3, $wordsub2);
                        $word2sub2 = str_replace($find4, $replace4, $wordsub2);

                        $zipsub2->addFromString("word/document.xml", $word2sub2);
                        $zipsub2->close();
                      }

                      //more directories when needed
                      //****replicate code here****

                      //add files to archive
                      $zip_download->addFile($subsubfile2, $subsubfile2);
                    }
                  }
                }
              }

              //add files to archive
              $zip_download->addFile($subsubfile, $subsubfile);
            }
          }
        }
      } else    {
                die ("Error - No files in the directory");
                }
      }

      //add files to archive
      $zip_download->addFile($file, $file);

    }

    $zip_download->close();

    //download zip
    if (file_exists($zipfile) && is_readable($zipfile)) {
      header('Content-Type: application/octet-stream');
      header('Content-Length: '.filesize($zipfile));
      header('Content-Disposition: attachment; filename="'.basename($zipfile).'";');
      header('Content-Transfer-Encoding: binary');
      $file_download = @ fopen($zipfile, 'rb');
      if ($file_download) {
        fpassthru($file_download);
        exit;
      }

        echo ("ZIP generated successfully, download is starting...");

    } else  { 
            echo ("Error creating the ZIP archive!"); 
            }
}
?>

1 个答案:

答案 0 :(得分:0)

我认为这是因为Scandir()会产生类似

的东西
`Array
   (
      ...
      [9] => .
      [10] => ..`

在数组的末尾,当你检查它们是否是文件夹时,可能会发生错误并死亡。