2011-07-16 15 views
0

これは私のローカルホストでは正常に動作していますが、アップロード先のサーバでは動作しません。サーバーでは、zipは作成されますが、フォルダは作成されず、.zip内にすべてのファイルが置かれます(フォルダは区別されません)。サーバでZip関数が正しく動作しない

function rzip($source, $destination) { 
    // create object 
    $zip = new ZipArchive(); 
    // open archive 
    if ($zip->open($destination, ZIPARCHIVE::CREATE) !== TRUE) { 
     die ("Could not open archive"); 
    } 

    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source)); 
    foreach ($iterator as $key=>$value) { 
     $new_filename = substr($key,strrpos($key,"/") + 1); 
     $zip->addFile(realpath($key), $new_filename) or die ("ERROR: Could not add file: $key"); 
    } 

    $zip->close(); 
} 
+0

私はあなたのローカルホスト上で動作する理由を知りませんが、各ファイルのベース名をzipに追加するだけです。 zipは、そのファイルが属するZIPファイル内のどのフォルダを知るべきですか? – hakre

+0

realpathのため – luqita

+0

いくつかのヒントについては、サーバーのエラーログをチェックする必要があります。また、あなたのサーバーとあなたのlocalhostのphp-versionが一致するかどうか確認する必要があります。あなたの質問にそれらのものを編集してください。 –

答えて

0

あなたは誤使用(または使用していない)場所でRecursiveDirectoryIteratorです。

最初の点は、おそらく望ましくないドットフォルダ(...)を反復処理することです。これを停止するには、SKIP_DOTSフラグを使用してください。

次に、繰り返し実行されるメインディレクトリに対するファイルのパスを取得し、の実パスも取得するツールがあります。 getSubPathname()およびgetRealpath()の方法をそれぞれ使用して、

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
       $source, RecursiveDirectoryIterator::SKIP_DOTS)); 
foreach ($iterator as $key => $value) { 
    $localname = $iterator->getSubPathname(); 
    $filename = $value->getRealpath(); 
    $zip->addFile($filename, $localname) or die ("ERROR: Could not add file: $key"); 
} 

上記の説明は、コメントとしては長すぎるためです。何も答えられない理由は、「これはローカルホストでは完全に機能していますが、サーバーにはありません」です。

+0

このようにしました。$ iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator( $ source)); \t \t foreach($ iteratorを$ key => $ value){ \t $ localname = $ iterator-> getSubPathname(); \t $ filename = $ value-> getRealpath(); \t $ zip-> addFile($ filename、$ localname)またはdie( "エラー:ファイルを追加できませんでした:$ key"); \t \t} – luqita

関連する問題