2017-03-14 10 views
0

私はいくつかのファイルとサブディレクトリを含む圧縮されたディレクトリを持っています。私が達成したいのは、圧縮されたディレクトリの内容を変更し、変更されたzipファイルをダウンロードして、元のzipファイル内で変更が変更されないようにすることです。PHPで元のファイルに変更を加えずに圧縮ディレクトリを変更してダウンロードするには?

たとえば、圧縮されたディレクトリ内の特定のファイルを削除し、修正されたzipファイルをダウンロードして、元の圧縮されたディレクトリにファイルが残っているようにしたいとします。

ここまでは私のコードです。それが正常に動作しますが、問題は、ファイルには、元の圧縮ディレクトリ内に削除されていることである。

<?php 

$directoryPath = '/Users/Shared/SampleDirectory.zip'; 
$fileToDelete = 'SampleDirectory/samplefile.txt'; 

$zip = new ZipArchive(); 

if ($zip->open($directoryPath) === true) { 
    $zip->deleteName($fileToDelete); 
    $zip->close(); 
}  

header('Content-Description: File Transfer'); 
header('Content-Type: application/zip'); 
header('Content-Disposition: attachment; filename="' . basename('SampleDirectory.zip') . '"'); 
header('Content-Length: ' . filesize('SampleDirectory.zip'));; 
readfile('SampleDirectory.zip'); 

?> 

にはどうすれば所望の機能を達成することができますか?

答えて

1

すべてのzip関数は、zipファイルの内容を変更します。最も簡単な方法は、PHPのcopy()関数を使用して一時的な場所にファイルのコピーを作成し、そのファイルの変更を操作することです。名前の競合を避けるためにtempnam()を使用し、完了後にファイルをunlink()使用することができます。ここで

は例です:

$directoryPath = '/Users/Shared/SampleDirectory.zip'; 
$fileToDelete = 'SampleDirectory/samplefile.txt'; 

$temp = tempnam('/tmp'); 
copy($directoryPath, $temp); 

$zip = new ZipArchive(); 

if ($zip->open($temp) === true) { 
$zip->deleteName($fileToDelete); 
$zip->close(); 
}  

header('Content-Description: File Transfer'); 
header('Content-Type: application/zip'); 
header('Content-Disposition: attachment; filename="'.basename('SampleDirectory.zip').'"'); 
header('Content-Length: ' . filesize($temp)); 
readfile($temp); 

unlink($temp); 

警告:未テストコード、あなたがファイルへのバックアップを持っていることを確認してください。

関連する問題