【问题标题】:PHP can't access newly created zip filePHP 无法访问新创建的 zip 文件
【发布时间】:2016-11-28 13:56:45
【问题描述】:

我正在使用 Laravel 5.2 和 Zipper 快速创建 ZIP 存档并由用户下载。我认为这个问题通常与 Laravel 或 Zipper 没有严格的关系。步骤:

  1. 用户点击链接download_all
  2. 第一个 php 脚本创建存档。
  3. 接下来同样的脚本推送创建的文件来强制用户下载。

一切听起来都很正常,但我有奇怪的行为,在创建 zip 存档后(第 2 点)php/server 看不到这个新创建的文件。 $filePath 上的 filesize 和 file_exists 都返回 false,但文件存在。 我无法读取文件为什么?

当我将用户重定向到 $filePath(而不是阅读并推送下载)时,一切正常,用户获取文件。但是为什么我在“脚本生命周期”期间无法访问新创建的文件? $paths 是正确的。 在 Windows 7 和 Unix 上测试。

有什么想法吗?

代码:

public function downloadAll($id)
    {
        $sourceFilesDir   = 'upload/source/' . $id;
        $zipPath          = 'upload/source-zip/' . date('Y-m-d-H-i-s') . '.zip';

        Zipper::make($zipPath)->add($sourceFilesDir);

        $fullPath = public_path($zipPath);

        // works
        // return response()->redirectTo($zipPath);

        $headers = [
            'Content-Type: application/zip',
            'Content-Transfer-Encoding: Binary',
            'Content-Length: ' . filesize($fullPath),
        ];

        // dont works, cant see file
        return response()->download($fullPath, basename($zipPath), $headers);
    }

【问题讨论】:

  • 您是否添加了下载所需的标题?
  • 是的,当然,上面的代码已编辑
  • 这不是 AJAX 调用,对吧?
  • 可能必须关闭拉链才能将使用的临时文件重命名为正确的名称。
  • 不,它不是 AJAX 调用,它是正常的

标签: php laravel-5 ziparchive zipper


【解决方案1】:

由@Holger 提出。 拉链应关闭以保存文件。

正确的代码:

Zipper::make($zipPath)->add($sourceFilesDir)->close();

->close()

不幸的是,在 Zipper 文档中没有明确提到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多