php - 添加 csv 文件后下载的 zip 存档为空

标签 php mysql csv

必要时可以跳过关于和目标。他们提供有关计划的上下文/背景。

问题:
当我下载一个应该包含 csv 文件的 zip 存档时,我得到一个空存档或无效存档。现在,我可以在服务器上制作带有 csv 的 zip 存档,并通过 FileZilla 下载。这不是所需的用例。用户希望在单击按钮后自动下载。

关于程序:
代理商报名参加事件(即 RSVP)并提供一组照片。 对于每个代理,都有 +1 照片。用户想要下载每个事件的所有 RSVP 列表(即注册数据)。对于每个 RSVP,用户还希望看到他们上传到服务器的照片。

项目目标:

  1. 在mysql查询的服务器上创建csv文件(每行是一个RSVP)
  2. 对于每一行,为该行/RSVP 的照片创建 zip 存档。
  3. 需要:1 个 csv 文件和多个 zip 存档,全部放在一个大存档中
  4. 最终结果:将所有文件添加到一个 zip 存档中并下载给用户。
  5. 附录:每次请求时都需要重新生成这个大 zip 文件。

项目现状:
已创建 CSV 文件。下面它被添加到 ZipArchive 对象。下载 zip 文件并发现它

//store the result of the query. Included to show process
$result = mysqli_query($dbh, $sql);
//open the file to write the information to.
$file = fopen('event-report.csv', 'w');
$txt .= 'Title Company,' .'Event ID,' . 'Event Time,' . 'First Name,' . 'Last Name,' . 'Email,' . 'Agent Company,' . 'Phone Number,' . 'Listing ID,' . 'URL,' . 'Address,' . 'ZIP,' . "\n";
while ($row = mysqli_fetch_row($result)){
    for ($i=0; $i<12; $i++){
        $txt .= $row[$i] . ',';             //About the agent attending
    }
    $txt .= "\n";
    $listings[$listing_count] = $row[8];    
}
fputs($file, $txt); //store into csv file
fclose($file);        //verified on server; contains desired output

$zip = new ZipArchive();
$dir = 'tmp';                  //create temporary directory with write access
if ( !file_exists($dir) ) {
    mkdir ($dir, 0755);        //Everything for owner, read/execute for others
}
if($zip->open('test.zip', ZIPARCHIVE::CREATE) === TRUE ){

    $zip->addFile('event-report.csv');
    if (file_exists($zip->getFromName('event-report.csv'))){
        echo "Exists";
    }
    else{
        echo "Does Not Exist";
        echo $_SERVER['DOCUMENT_ROOT'];
    }
}
else {
    echo "Failed code";
}
$zip->close();
if(!$return){
    echo " You do not have write access to current folder.";
}
else{
    echo "You do have access.";  //without headers, the zip containing csv successfully created on server.
}

header('Content-disposition: attachment; filename=download.zip');
header('Content-type: application/zip');
readfile($dir.'/test.zip');     //When downloaded: still empty/invalid.

可能的问题

  1. Zip 找不到该文件,因为它是同时创建的。
    1a. 已解决:。创建的文件可以在关闭后立即放入 zip 存档。
  2. addFile 参数不正确或缺失。
    2a.手册页对此参数说:“要添加的文件的路径”
    2b.尝试将路径放在域名后面但没有成功:
    $zip->addFile('/f1/f2/f3/f.csv');
    2c. PHP Manual > ZipArchive::addFile
      我。 已解决:参数只是文件名。在这种情况下不需要路径。

问题

  1. 如何将 csv 文件、zip 存档或任何一般文件添加到 另一个 zip 存档,以便在我下载时它不会为空?
  2. 这个实现是否不正确,因为我正在尝试添加一个文件 创建后立即将其保存到 zip 存档?请参阅可能的问题 1。
  3. 如果这个问题可以通过一点阅读来解决,那么您可以链接哪些资源来指导我?我花了一个 关于这个问题的一整天阅读,我不觉得 了解我在这里缺少的东西。
    3a. file permissions

最佳答案

添加到存档时,您需要明确使用绝对路径。

$zip->addFile($abs_path, $relative_path); 

关于php - 添加 csv 文件后下载的 zip 存档为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24989271/

相关文章:

php - 如何将 CSS 类分配给 WooCommerce 中的库存数量?

mysql - 从 mysql 中检索 SELECT 语句中的日期

php - Linux 和 Windows 进程之间的 IPC

mysql - 使用 127.0.0.1 为特权 root 用户连接 mysql 时出错

c# - 将每个 CSV 文件记录转换为单独的 JSON 文件

PHP如何在这种情况下优化写入文件

javascript - 联系表上的错误

php - 我可以将 php 与 phonegap 一起使用吗?

php - CSS - 图像的透明背景不在网站上呈现

python - 这个在 .csv 上运行的 python 程序有什么问题?