2013-02-09 21 views
6

Tôi nhận được tệp zip được tải xuống bằng mã sau mà không có bất kỳ lỗi nào nhưng tệp zip đã tải xuống trống hoặc bị hỏng và kích thước luôn là khoảng 200 byte. tức là tôi không thể mở tệp zip đó. Cũng ZipArchive :: getStatusString() cũng được hiển thị "Không có lỗi"Nhận zip bị hỏng hoặc rỗng bằng ZipArchive php

code is:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
+0

điều này khiến tôi sai. điều này có nghĩa là thư mục $ zipname không được tạo. Nhưng không nhận được thông báo "Không có gì trong giỏ" thay vì tải xuống tệp zip. –

Trả lời

3

Đây là dự đoán tốt nhất của tôi. Có gì sai ở đây là trong mảng của bạn $files các giá trị bạn đang lưu trữ có lẽ không phải là đường dẫn thực sự đến tệp.

Hãy nhớ: Bạn không thể chuyển URL vào $zip->addfile(), bạn cần tệp thực sự của mình.

5

Hãy thử nhận được đường dẫn tập tin và ghi rõ họ tên ngay trước $zip->close();

$filename = $zip->filename; 

Và sử dụng mà thay vì $zipname khi đọc tệp và nhận kích thước tệp

+0

@Pony Kiểm tra điều này cũng .. Vẫn gặp vấn đề tương tự. Tôi nghĩ rằng Thư mục cho tệp không được tạo. Ngoài ra tôi đã kiểm tra 'var_dump ($ filename)' hiển thị đường dẫn chính xác. –

+0

Bạn đã gán biến này trước khi gọi '$ zip-> close()'? –

+0

Làm việc như một sự quyến rũ! Cảm ơn :) – Scott

0

Thậm chí khó khăn câu hỏi này đã được tìm ra, tôi sẽ đăng những gì tôi phát hiện ra cách kéo khóa hỏng có thể được tạo ra:

Khi thực hiện một zip lưu trữ bạn thường sẽ gỡ lỗi với echo/lệnh print_r. Nếu bạn không xóa chúng, tệp nén đầu ra sẽ bị hỏng.

Ví dụ dựa trên câu hỏi:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { 
     // to fix your corrupt zip file, remove this line. 
     echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
1

Thêm vào chủ đề này mặc dù vấn đề ban đầu đã được giải quyết kể từ khi tôi chỉ cần bỏ ra một vài giờ với một vấn đề tương tự.

Hóa ra tất cả các tệp cần phải tồn tại khi thực hiện $ zip-> close(), bất kể khi nào bạn sử dụng $ zip-> addFile() để thêm chúng. Vì vậy, nếu bạn tạo các tệp tạm thời, thêm chúng vào zip của bạn và sau đó xóa chúng trước khi bạn đã sử dụng close(), bạn có thể kết thúc với một kho lưu trữ trống/bị hỏng.

0

Tôi đã giải quyết vấn đề tương tự bằng cách di chuyển mã đến cùng một thư mục chứa các tệp mà tôi muốn thêm vào lưu trữ Zip.