web-dev-qa-db-ja.com

zip内のファイルへのパスなしでzipを作成するphp

私はphpを使用してZipファイルを作成しようとしています(このページから取得- http://davidwalsh.name/create-Zip-php )が、Zipファイル内はすべてのフォルダ名をファイル自体に。

Zip内のファイルからすべてのフォルダーを除外することは可能ですか?

私のコードは次のとおりです。

function create_Zip($files = array(), $destination = '', $overwrite = true) {

    if(file_exists($destination) && !$overwrite) { return false; };
    $valid_files = array();
    if(is_array($files)) {
        foreach($files as $file) { 
            if(file_exists($file)) { 
                $valid_files[] = $file;
            };
        };
    };
    if(count($valid_files)) { 
        $Zip = new ZipArchive();
        if($Zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
            return false;
        };
        foreach($valid_files as $file) { 
            $Zip->addFile($file,$file);
        };
        $Zip->close();
        return file_exists($destination);
    } else {
        return false;
    };

};


$files_to_Zip = array('/media/138/file_01.jpg','/media/138/file_01.jpg','/media/138/file_01.jpg');

$result = create_Zip($files_to_Zip,'/...full_site_path.../downloads/138/138_files.Zip');
47
SoulieBaby

ここでの問題は、$Zip->addFileには、同じ2つのパラメーターが渡されています。

ドキュメント によると:

bool ZipArchive ::addFile ( ストリング $ filename [、 ストリング $ localname ])

ファイル名
追加するファイルへのパス。

localname
Zipアーカイブ内のローカル名。

つまり、最初のパラメーターはファイルシステム内の実際のファイルへのパスであり、2番目のパラメーターはファイルがアーカイブ内に持つパスとファイル名です。

2番目のパラメーターを指定する場合、Zipアーカイブに追加するときにパスを削除する必要があります。たとえば、Unixベースのシステムでは、次のようになります。

$new_filename = substr($file,strrpos($file,'/') + 1);
$Zip->addFile($file,$new_filename);
123
Nathan Osman

より良いオプションは次のとおりだと思います:

$Zip->addFile($file,basename($file));

これは単にパスからファイル名を抽出します。

43
Carlos Évora

これは私が見つけた別の方法であり、私のために働いた

$zipname = 'file.Zip';
$Zip = new ZipArchive();
$tmp_file = tempnam('.','');
$Zip->open($tmp_file, ZipArchive::CREATE);
$download_file = file_get_contents($file);
$Zip->addFromString(basename($file),$download_file);
$Zip->close();
header('Content-disposition: attachment; filename='.$zipname);
header('Content-type: application/Zip');
readfile($tmp_file);
0