1

私はちょっと問題に行き詰まっており、ここの誰かが光を当てることができることを願っています.

いくつかの関数を使用して .zip ファイルとそのフォルダーを解凍していますが、これは正常に機能します。しかし、他のディレクトリから関数を使用しようとすると、機能しないか、フォルダー dirs を作成してファイルを書き込めないようです。

次のコードを使用して .zip ファイルを解凍しています。

<?PHP error_reporting(e_all);

include("../../includes/config.php");


/**
 * Unzip the source_file in the destination dir
 *
 * @param   string      The path to the ZIP-file.
 * @param   string      The path where the zipfile should be unpacked, if false the directory of the zip-file is used
 * @param   boolean     Indicates if the files will be unpacked in a directory with the name of the zip-file (true) or not (false) (only if the destination directory is set to false!)
 * @param   boolean     Overwrite existing files (true) or not (false)
 * 
 * @return  boolean     Succesful or not
 */

function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true)
{
  if ($zip = zip_open($src_file))
  {
    if ($zip)
    {
      $splitter = ($create_zip_name_dir === true) ? "." : "/";
      if ($dest_dir === false) $dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";

      // Create the directories to the destination dir if they don't already exist
      create_dirs($dest_dir);

      // For every file in the zip-packet
      while ($zip_entry = zip_read($zip))
      {
        // Now we're going to create the directories in the destination directories

        // If the file is not in the root dir
        $pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
        if ($pos_last_slash !== false)
        {
          // Create the directory where the zip-entry should be saved (with a "/" at the end)
          create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
        }

        // Open the entry
        if (zip_entry_open($zip,$zip_entry,"r"))
        {

          // The name of the file to save on the disk
          $file_name = $dest_dir.zip_entry_name($zip_entry);

          // Check if the files should be overwritten or not
          if ($overwrite === true || $overwrite === false && !is_file($file_name))
          {
            // Get the content of the zip entry
            $fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

            file_put_contents($file_name, $fstream );
            // Set the rights
            chmod($file_name, 0777);
            echo "save: ".$file_name."<br />";
          }

          // Close the entry
          zip_entry_close($zip_entry);
        }      
      }
      // Close the zip-file
      zip_close($zip);
    }
  }
  else
  {
    return false;
  }

  return true;
}

/**
 * This function creates recursive directories if it doesn't already exist
 *
 * @param String  The path that should be created
 * 
 * @return  void
 */

function create_dirs($path)
{
  if (!is_dir($path))
  {
    $directory_path = "";
    $directories = explode("/",$path);
    array_pop($directories);

    foreach($directories as $directory)
    {
      $directory_path .= $directory."/";
      if (!is_dir($directory_path))
      {
        //mkdir($directory_path);

        my_ftp_mkdir2('httpdocs/templates/temp/', $directory_path);

        //chmod($directory_path, 0777);
      }
    }
  }
}

/* CHMOD with FTP */

function my_ftp_mkdir2 ($path, $dir) {
    $server = "ftp.domainname.com";

    // Connect to FTP server
    $connection = ftp_connect ($server);

    // Login on FTP server
    $user = "username";
    $pass = "password";
    $result = ftp_login ($connection, $user, $pass);

    if ((!$connection) || (!$result)) {
        return false;
    }
    // Go to the dir thats been given
    if (!@ftp_chdir ($connection, $path)) {
        ftp_close($connection); // close FTP connection
        return false;
    }

    // Create the map and set the rights
    if (!@ftp_mkdir($connection, $dir)) {
        ftp_close($connection); // close FTP connection
        return false;    
    }

    $chmod_cmd = "CHMOD 0777 " . $dir;
    $chmod = ftp_site($connection, $chmod_cmd);

    ftp_close($connection); // close FTP connection

    return true;
}



if (!unzip("../user1/test2.zip", false, true, true)) {
    echo 'The file has failed to be unzipped!';
} else {
    echo 'The file has been unzipped!';
}


?>

これでうまくいきます。

しかし、次のテストディレクトリでこのファイルを実行しています: httpdocs/templates/temp/unzip.php

test2.zip というファイルは、httpdocs/templates/user1/test2.zip にあります。

したがって、スクリプトを実行すると、次のようになります: httpdocs/templates/user1/test2/index.html httpdocs/templates/user1/test2/img/ など..

しかし、httpdocs/ ディレクトリからこのスクリプトを実行すると、解凍されたと表示されますが、ディレクトリなどは作成されません。

私のPHPにはセーフモードがあり、テスト目的でFTPを使用してディレクトリを777にchmodしました。

したがって、このスクリプトを httpdocs/unzip.php で実行すると

私はこのように関数を呼び出します。

<?php
if (!unzip("templates/user1/test2.zip", false, true, true)) {
    echo 'The file has failed to be unzipped!';
} else {
    echo 'The file has been unzipped!';
}
?>

しかし、これはうまくいかないようです。誰かが私に良いアドバイスをくれることを願っています。ありがとう!

4

2 に答える 2

0

httpdocsの所有者をWebサーバーのユーザーに設定します(通常はwww-dataをapacheするため)

chown www-data:www-data /path/to/htttpdocs -R

注:ファイルに自分でアクセスする必要があると思うので、最初のwww-dataをユーザー名と交換します(例:user123:www-data)。

注2:ウェブサーバーのエラーログを確認すると、正確なエラーメッセージが表示されます。私はそれが許可拒否の問題であると推測することしかできません(Apache標準パスは/var/log/apache2/error.logです)

注3:セーフモードはPHP5.4で削除されました。更新することをお勧めします。

于 2012-04-24T05:49:46.330 に答える
0

私は絶対パスを使用してそれを行います&

mkdir($abspathdir,0777) 

(& パーミッションをリセットした後に umask )

新しいフォルダを作成するために ftp 接続を開く理由はありますか?

デバッグするには

echo $abspathdir,'<br/>'; 

mkdir の前に、どのディレクトリが作成されているか (作成しようとしているか) を確認します。パスが実際に正しいが、ディレクトリが作成されていない場合、親フォルダーの権限の問題にすぎない可能性があります。

于 2012-04-24T06:27:49.070 に答える