PHP ZipArchive中的PDF引发错误,服务器权限[关闭]

Posted

技术标签:

【中文标题】PHP ZipArchive中的PDF引发错误,服务器权限[关闭]【英文标题】:PDF in PHP ZipArchive throwing errors, server permissions [closed] 【发布时间】:2015-08-10 08:41:03 【问题描述】:

我正在从服务器收集一些文件并使用 php 生成一个 ziparchive。在我下载 zip 存档并尝试打开文件之前,一切都非常顺利。阅读器抛出异常“不支持文件类型纯文本文档(text/plain)”。该文件命名正确(c102.pdf)。我认为文件的 mime 类型有些混乱,但我不太确定。

php 版本 5.4.37

我应该注意,我在本地使用的是 ubuntu 14.04,我的阅读器是默认的文档查看器,但是,它确实在上传之前正确读取了文件。

跟进 - 这可能是权限问题吗? “下载”目录设置为 777,而其中创建的新 zip 文件为 644。就好像“空白”文件被放置在 zip 存档中(zip 的总大小为 1.6k,应该至少几百)。

另一个跟进 - 以下之前的帖子讨论了 chmod 问题 PHP: generated zip has chmod 644 和 how to set permission 777 to a zip file? 。但是 chmod() 方法对我不起作用 - chmod() 无法在服务器上执行(我已经修改了下面的代码)。我们会看看技术支持怎么说。

在这种情况下回答.....

在与客户支持交谈后 - 这一切都不起作用的原因是因为我使用的是共享主机帐户。 chmod() 函数受到限制,否则应该可以工作。


我的传奇还在继续…… 我现在在 EC2 实例上有一个 LAMP 堆栈,就在我以为我是老板的时候——我仍然处于同一个绑定中。我的程序在正确的目录中生成一个 zip 文件 - 具有所有适当的文件名 - 但文件是空的。我仍然认为这是一个所有权/权限问题。所以,一些后续问题...

网络服务器上的文件夹归“Ubuntu”所有,而新创建的文件归“www-data”所有。那么,谁是“www-data”?是 Apache 还是 PHP? PHP 也是 Apache 吗?为什么我不能在创建文件后 chmod() 使它们不是 644? zip 的文件状态为 644 是我无法写入它们的原因吗?我可以强制目录中新创建的文件拥有不同的所有权或一组特定的权限吗?

 if (isset($_GET['getzip']))   
    $issuedsetid = $_GET['getzip'];
    $time = mktime();

    $sql = "SELECT * FROM issuedsets WHERE id=$issuedsetid";
        if ($result = $mysqli->query($sql)) 
            while($row = $result->fetch_assoc()) 
                $packid = $row['packid'];
                $sheets = $row['sheets'];
                $sheets = explode(",",$sheets);
            
        

    $sql = "SELECT * FROM pname WHERE id=$packid";
        if ($result = $mysqli->query($sql)) 
            while($row = $result->fetch_assoc()) 
                $packname = $row['name'];
            
        

    // create the zip file
    $path = "/home/marekfalkowski/public_html/index/downloads/".$packname."_" . $time . ".zip";
    $zip = new ZipArchive();  

// Open a new zip file  
    $zip->open($path, ZipArchive::CREATE); 

    if (chmod($path,0777))
        echo "chmod succesful";
     else 
        echo "not succesful";
    
    foreach($sheets as $sheet)

        // the saved file name as it exists on the server...
        $file = $sheet.".pdf";

        // the new name of the file...
        $sql = "SELECT * FROM files WHERE id=$sheet";
            if ($result = $mysqli->query($sql)) 
                while($row = $result->fetch_assoc()) 
                    $filename = $row['number']."-".$row['name'].".pdf";
                
            
        // add the files
        if (file_exists("/home/marekfalkowski/public_html/index/uploads/".$file))    
        $zip->addFile("/home/marekfalkowski/public_html/index/uploads/".$files, $filename);
         else 
                echo "not there";
            
        
        $zip->close();
    

【问题讨论】:

【参考方案1】:

这是一个愚蠢的错误。这一行:

$zip->addFile("/home/marekfalkowski/public_html/index/uploads/".$files, $filename);

需要改成这样:

$zip->addFile("/home/marekfalkowski/public_html/index/uploads/".$file, $filename);

这真是浪费时间。现在可以使用了。

【讨论】:

以上是关于PHP ZipArchive中的PDF引发错误,服务器权限[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

php ZipArchive - 只添加文件而不是父文件夹

来自不同目录问题的 PHP ZipArchive::AddFile

PHP:使用 ZipArchive 创建 zip 文件时出现错误 (500)

为啥 RMarkdown 中的“Knit to pdf”会引发错误?

ZipArchive php 获取损坏或空的 zip

PHP7中的ZipArchive找不到zip的内容