在一个单独的目录中用PHP创建一个ZIP压缩包

问题描述:

我有一个WordPress站点,我正在为我工​​作的公司创建一个HR插件。一个功能允许管理员下载包含多个文档的zip文件。我测试了下面的代码,它工作正常,但我希望在我选择的目录中创建ZIP存档。在一个单独的目录中用PHP创建一个ZIP压缩包

function direct_download() 
{ 
    if ($_REQUEST['action'] == 'download') 
    { 
     $App = new DHR_Application(); 
     $file_name=str_replace(" ","_",$App->Fname)."_".str_replace(" ","_",$App->Lname)."_".$App->ID; 
     $txt_name=$file_name.".txt"; 
     $txt_path="../user-upload/temp/".$file_name.".txt"; 
     $arc_name=$file_name.".zip"; 


     $txt=$App->Fname." ".$App->Lname."\r\n".$App->ID; 
     $file=fopen($txt_path,"w+"); 
     fwrite($file,$txt); 

     $zip = new ZipArchive(); 

     if ($zip->open($arc_name, ZIPARCHIVE::CREATE)!==TRUE) 
     { 
      exit("cannot open <$arc_name>\n"); 
     } 
     $nameAtt1 = pathinfo($App->Att1,PATHINFO_BASENAME); 
     $zip->addFile($App->Att1,$nameAtt1); 
     if (($App->Att2 != '') && ($App->Att2 != null)) 
     { 
      $nameAtt2 = pathinfo($App->Att2,PATHINFO_BASENAME); 
      $zip->addFile($App->Att2,$nameAtt2); 
     } 

     $zip->addFile($txt_name,$txt_path); 
     $zip->close(); 
     fclose($file); 

     header("Content-type: application/zip"); 
     header("Content-Disposition: attachment; filename=$arc_name"); 
     header("Pragma: no-cache"); 
     header("Expire: 0"); 
     readfile("$arc_name"); 
     exit(); 
    } 
} 

通常,ZIP存档文件是在/ wp-admin /目录下创建的。我不想在此目录中创建和删除临时文件,因为它运行的是wordpress的后端。

当我在$arc_name中包含文件的路径时,代码会中断。我查看了$ zip-> filename的值,并将值从“C:/wamp/www/company/user-upload/temp/Tony_Beroni_000001.zip”更改为“C:\ wamp \ www \ company \ user-上传\\ TEMP \ Tony_Beroni_000001.zip”。我认为这可能是一个问题,因为WAMP和本地Apache服务器之间的区别(没有双关意图)。

有谁知道如何在特定的目录下用PHP创建ZIP压缩文件?

编辑:我注意到,我在相反有参数为$zip->addFile($txt_name,$txt_path);应该$zip->addFile($txt_path, $txt_name);

如果你在做跨平台开发(即Windows和Linux)。你应该alwasy指定使用PHP DIRECTORY_SEPARATOR常数像路径:

$full_file_path = DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'to'. DIRECTORY_SEPARATOR . 'file' . DIRECTORY_SEPARATOR . $file_name; 

可以,只要你喜欢定义路径,只要运行Web服务器有权限写入该路径。

+0

使用DIRECTORY_SEPARATOR进行更改后,我的编辑中的代码完美工作。至于标题信息,我将文件名保存为$ arc_name,当我调用$ zip-> open()和readfile()时,我使用一个新值$ arc_path,其中包含名称和路径。谢谢,迈克。 – Gecko 2012-07-26 16:23:57

$ arc_name是您定义zip路径 的第一个参数,用于打开zip。