2012-03-12 6 views
2
function create_zip($files = array(),$destination = '',$overwrite = false) { //if the zip file already exists and overwrite is false, return false 

if(file_exists($destination) && !$overwrite) { return false; } 

//vars 

$valid_files = array(); 

//if files were passed in... 

if(is_array($files)) { 

//cycle through each file 

foreach($files as $file) { 

//make sure the file exists 

    if(file_exists($file)) { 

    $valid_files[] = $file; 

    } 
} 

} 

//if we have good files... 

if(count($valid_files)) { 

//create the archive 

$zip = new ZipArchive(); 

if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) 

!== true) { 

    return false; 

} 

//add the files 

foreach($valid_files as $file) { 

    $zip->addFile($file,$file); 

} 

//debug 

//echo 'The zip archive contains ',$zip->numFiles,' files with a status of 

',$zip->status; 

//close the zip -- done! 

$zip->close(); 


//check to make sure the file exists 

return file_exists($destination); 

} 

else 

{ 

return false; 

} 

} 

// using function as 

include('functions.php'); 

$files_to_zip = array(

'database/350-001(3.1).examdb', 

'setup/ExaminationEngine.exe' 

); 

//if true, good; if false, zip creation failed 

$result = create_zip($files_to_zip,'my-archive.zip'); 

私はこの機能を使ってzipを作成しています。ファイル内の別の場所からファイルをZipファイルにします

すべてのことが完璧に機能していますが、zipファイルで作成されたファイルはフルパスで作成されています。my-archive.phpには2つのファイルしかありません。 my-archive.php datbase/350-001(3.1).examdbsetup/ExaminationEngine.exeデータベースとセットアップフォルダ内に作成されます。

どうすればこの問題を解決できますか?

+0

参照してください。だから何を思いついたの? – hakre

+0

私は必要なだけ完璧に動作する他の機能を参照できますか? – user1138383

+0

//コードを郵便番号 に置き換えます。foreach($ valid_filesを$ file){ $ zip-> addFile($ file、$ file); } //以下のコードを使用してください foreach($ valid_files as $ f){ $ filename_parts = explode( '/'、$ f); //ファイル名を '/'文字で分割します。 $ zip-> addFile($ f、end($ filename_parts))またはdie( "ERROR:ファイルを追加できませんでした:$ f"); } – user1138383

答えて

0

テンポラリフォルダを準備し、そこにある別の場所からファイルをコピーして圧縮し、一時フォルダを削除することをお勧めします。そうでなければかなり退屈な音がする。

+0

どうすればいいですか?ヘルプ@jpic – user1138383

+1

正確に何をしますか? – jpic

+0

はいplzは私のスクリプトを変更@jpic – user1138383

2

は(私はあなたが今いると仮定ADDFILEの第2引数は「ローカルパス」で、$ファイルのベース名は、あなたがそれに渡したいものです

//add the files 
foreach($valid_files as $file) { 
    $zip->addFile($file,basename($file)); 
} 

代わりの

//add the files 
foreach($valid_files as $file) { 
    $zip->addFile($file,$file); 
} 

を試してみてください

ファイル名が一意であることを手動でアサートする必要があることに注意してください。

は、あなたがやりたいために他のいくつかの機能を必要とする

http://php.net/manual/en/ziparchive.addfile.php

http://php.net/manual/en/function.basename.php

+0

$($ valid_files $ f){ $ filename_parts = explode( '/'、$ f); //ファイル名を/ /ファイルを追加できませんでした:$ f "); $ zip-> addFile($ f、end($ filename_parts))またはdie("エラー:ファイルを追加できませんでした:$ f "); } – user1138383

関連する問題