关于php:Zip PDF文件下载无效

Zip PDF-Files download not working

我正在构建一个接口,它允许从服务器路径收集PDF文件,并立即下载压缩文件,这在大多数情况下都可以正常工作。现在,一些PDF文件不工作,意味着如果zip包含一个不工作的文件,整个下载将不会执行。

现在我尝试了许多不同大小的文件。我可以看出,大多数大于10MB的文件都不工作,但一个文件(15MB)正在工作,所以它不能是导致此错误的文件大小-对吗?

发生的是根本没有下载。此外,还尝试读取"$zip->addfile"和"$zip->close"的结果,但这都是正确的,即使不会执行下载。任何可能导致这个错误的想法,或者至少一些关于如何发现这个问题的提示?

过程中变量的(x)调试检查在工作时间和不工作时间之间没有区别。唯一的区别是文件大小和路径。

下面是我用来构建zip的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public function downloadFiles() {
        $myFiles = $this->Session->read('Files.MyFiles');
        if(count($myFiles)) {
            // build zip
            $zipname = 'amaz_photos_' . time() . '.zip';
            $zip = new ZipArchive();
            $zip->open($zipname, ZipArchive::CREATE);
            foreach($myFiles as $file) {
                if($file['type'] == 'directory') {
                    $dirName = str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/'))));
                    $zip->addEmptyDir($dirName);
                    $this->addFolderToZip($file['path'] . '/', $zip, $dirName . '/');
                } else {
                    $zip->addFile($file['path'], str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/')))));
                }
            }
            $zip->close();
            // get(send) zip
            header('Content-Type: application/zip');
            header('Content-disposition: attachment; filename=' . $zipname);
            header('Content-Length: ' . filesize($zipname));
            readfile($zipname);
            ignore_user_abort(true);
            unlink($zipname);
        }

        // clear"myFiles"
        //$this->Session->write('Files.MyFiles', array());

        $this->redirect(array(
            'controller' => 'pages',
            'action' => 'display'
        ));
    }

毕竟,我尝试用包括Adobe原版在内的几个PDF阅读器打开受影响的文件,以确定它是否已损坏,但是?我?t?S?似乎没有。

这将发生在可打开的zip文件中,但下载不会以任何方式启动。我发现,在没有开始下载的特殊情况下,与工作时间相比,网络框架上没有设置响应头("application/zip")。

我还发现了:假设我有一个文件夹,里面有20个文件,但没有下载。我尝试选择文件1-10:下载,然后我尝试下载文件11-20:下载,然后我尝试下载文件1-20:不下载,然后我尝试了两次混合模式,首先是偶数文件2、4、6、8。(1-20),之后是奇数文件1、3、5、7、。(1-20):每个都没有下载。这说明错误不属于特定文件。

对于如何确定此错误的触发器有什么建议吗?

Update:

I was able to download the generated zip-file doing these steps:

  • Trigger 'create & download zip-file'

  • It creates a zip-file but not download it

  • Type the generated zip-files filename in the code to download it on the next procedure (e. g."$zipname ="generatedOnStep1.zip").

  • Trigger 'create & download zip-file' again
  • It does not download the (recently) generated file, but the file i generated in step 1. So it seems that: Generating Zip-Files is working AND downloading that same zip-File is working, but not at once and only in some unknown combinations.
  • Update 2:

    Since I was not able to determine the issue nor fix it, I ended up redesigning the whole process, to redirect to the generated zip-file instead of"readfile" it. Some features had to be sourced out but anyways it works this way.


    试试这个…取下readfile($zipname);,更换为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* make sure no other functions
    holding this file */

    $filehandle = fopen($zipname,"r");

    while (!feof($filehandle)) {
      /* lets read the file by pieces and
      send it to user's browser */

      echo fread($filehandle, 8192);
    }

    fclose($filehandle);

    希望这有帮助。