簡體   English   中英

Zip文件未在PHP中下載

[英]Zip file not downloading in PHP

我已經實現了創建文件的Zip文件夾(從db路徑)並下載PHP中的壓縮文件夾的代碼。 我正在使用Ubuntu OS。

public function actionDownload($id) {
            $model = $this->loadModel($id, 'Document');
            $results = array();
            $results = $this->createZip($model);

            $zip = $results[0];
            $size = filesize($zip->filename);

            if ($zip->filename) {             
                header("Content-Description: File Transfer");
                header("Content-type: application/zip");
                header("Content-Disposition: attachment; filename=\"" . $model->name . "\"");
                header("Content-Transfer-Encoding: binary");
                header("Content-Length: " . $size);

                ob_end_flush();
                flush();
                readfile($zip->filename);
                // To Store User Transaction Data
                //$this->saveTransaction();
                //ignore_user_abort(true);
                unlink($zip->filename);
                $zip->close();

                // Delete newly created files
                foreach ($results[1] as $fl) {
                    unlink($fl);
                }
            }       
    }


public function createZip($model) {

        $data = Document::model()->findAll('parent_folder=:id', array(':id' => (int) $model->document_id));
        $fileArr = array();
        foreach ($data as $type) {
            $fileArr[] = $type->path;
        }

        $filestozip = $fileArr; // FILES ARRAY TO ZIP
        $path = Yii::app()->basePath . DS . 'uploads' . DS . Yii::app()->user->id;

        //$model->path = trim(DS . $path . DS); // DIR NAME TO MOVE THE ZIPPED FILES        

        $zip = new ZipArchive();
        $files = $filestozip;
        $zipName = "USR_" . Yii::app()->user->id . "_" . $model->name . "_" . date("Y-m-d") . ".zip";

        $fizip = $path . DS . $zipName;
        if ($zip->open($fizip, ZipArchive::CREATE) === TRUE) {
            foreach ($files as $fl) {
                if (file_exists($fl)) {
                    $zip->addFile($fl, basename($fl)) or die("<p class='warning'>ERROR: Could not add file: " . $fl . "</p>");
                }
            }
        }

        $resultArr = array();
        $resultArr[] = $zip;
        $resultArr[] = $files;

        return $resultArr;
    }

Zip創建代碼可以正常工作,並且在那里可以創建zip文件,但問題是文件的所有者是www-data ,文件許可權是Read-Only

當我嘗試對該壓縮文件夾設置chmod($zip->filename, 0777)權限時,它顯示錯誤嗎?

Error 500
chmod(): No such file or directory

實際上文件在那里。

如果我嘗試不使用chmod()那么它向我顯示錯誤

Error 500
filesize(): stat failed for /home/demo.user/myapp/public_html/backend/uploads/1/USR_1_kj_2013-12-23.zip

然后不下載zip文件。

我面臨的這個問題確實很奇怪。 似乎是zip文件的權限問題,這就是為什么filesize()無法對該文件執行任何操作,但奇怪的是chmod()也無法正常工作的原因。

需要幫助。

謝謝

如果www-data具有讀取權限,則正確設置文件權限。 不需要chmod

您需要在下載調用$zip->close() ,因為僅在$zip->close() ,文件才會寫入磁盤。 除非將文件寫入磁盤,否則readfile()將不起作用。


一種更聰明的方法是僅使用php://memory流包裝器在內存中創建檔案。 但是,這僅是一種選擇,如果您只需要存檔一次下載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM