【问题标题】:Create a ZIP archive with PHP in a separate directory在单独的目录中使用 PHP 创建 ZIP 存档
【发布时间】:2012-07-25 06:28:02
【问题描述】:

我有一个 wordpress 网站,我正在为我工​​作的公司创建一个 HR 插件。其中一项功能允许管理员下载包含多个文档的 zip 文件。我已经测试了以下代码,它运行良好,但我希望在我选择的目录中创建 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();
    }
}

通常在 /wp-admin/ 目录中创建 ZIP 存档。我不希望在此目录中创建和删除临时文件,因为它运行 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-&gt;addFile($txt_name,$txt_path); 的参数,它应该是 $zip-&gt;addFile($txt_path, $txt_name);

【问题讨论】:

    标签: php directory zip wordpress wamp


    【解决方案1】:

    如果您正在进行跨平台开发(即 Windows 和 Linux)。您应该始终使用 PHP DIRECTORY_SEPARATOR 常量指定路径,例如:

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

    您可以随意定义路径,只要正在运行的网络服务器有权写入该路径。

    【讨论】:

    • 在使用 DIRECTORY_SEPARATOR 和我在编辑中所做的更改后,代码可以完美运行。至于标题信息,我将文件名保留为 $arc_name,当我调用 $zip->open() 和 readfile() 时,我使用了一个新值 $arc_path,其中包含名称和路径。谢谢你,迈克。
    【解决方案2】:

    $arc_name 是您定义 zip 路径的位置 它的第一个参数是 zip open。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 2010-12-23
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多