2013-02-09 28 views
6

द्वारा खाली जिप मैं किसी भी त्रुटि लेकिन डाउनलोड किया ज़िप फ़ाइल के बिना कोड का पालन करके डाउनलोड किया ज़िप फ़ाइल हो रही खाली है या भ्रष्ट और आकार हमेशा होता है के बारे में 200 बाइट्स। यानी मैं उस ज़िप फ़ाइल को नहीं खोल सकता। इसके अलावा ZipArchive :: getStatusString() भी दिखाया जा रहा है "कोई त्रुटि"भ्रष्ट हो रही है या ZipArchive php

कोड है:

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

यह मुझे झूठा दे रहा है। इसका मतलब है कि $ ज़िप नाम की निर्देशिका नहीं बनाई गई है। लेकिन मुझे ज़िप फ़ाइल डाउनलोड करने के बजाय "बास्केट में कुछ भी नहीं" का संदेश नहीं मिला है। –

उत्तर

3

यह मेरा सबसे अच्छा अनुमान है हो रही है। यहां क्या गलत हो रहा है कि आपके सरणी में $files आपके द्वारा संग्रहीत मूल्य शायद फाइलों के वास्तविक पथ नहीं हैं।

याद रखें: आप $zip->addfile() में URL पारित नहीं हो सकता, आप अपने वास्तविक फ़ाइलों की जरूरत है।

जब एक ज़िप संग्रह आप अक्सर गूंज/print_r आदेशों के साथ डिबग होगा बनाने:

5

बस से पहले $zip->close();

$filename = $zip->filename; 

और उपयोग पूर्ण फ़ाइल पथ और नाम हो रही कोशिश करें कि $zipname के बजाय जब फ़ाइल को पढ़ने और फ़ाइल आकार

+0

@ पोनी इसे भी जांचें .. फिर भी एक ही समस्या हो रही है। मुझे लगता है कि फ़ाइल के लिए निर्देशिका नहीं बनाई जा रही है। मैंने यह भी देखा कि 'var_dump ($ filename)' सटीक पथ दिखा रहा है। –

+0

क्या आपने 'x ज़िप-> बंद()' को कॉल करने से पहले इस चर को असाइन किया था? –

+0

एक आकर्षण की तरह काम किया! धन्यवाद :) – Scott

0

यहां तक ​​कि कठिन इस सवाल का पता लगा दिया गया है, मैं मैं क्या पता चला कैसे भ्रष्ट ज़िप बनाया जा सकता है पोस्ट करेंगे। यदि आप इन्हें साफ़ नहीं करते हैं, तो आउटपुट ज़िप फ़ाइल दूषित हो जाएगी।

उदाहरण प्रश्न के आधार पर:

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

इस सूत्र भले ही मूल समस्या के बाद से मैं सिर्फ एक समान समस्या के साथ कुछ घंटों बिताए हल किया गया है करने के लिए जोड़ा जा रहा है।

यह $ zip-> close() करते समय फ़ाइलों को मौजूद होने की आवश्यकता है, भले ही आप उन्हें जोड़ने के लिए $ zip-> addFile() का उपयोग करते हों।

तो यदि आप अस्थायी फ़ाइलें बनाते हैं, तो उन्हें अपने ज़िप में जोड़ें और फिर बंद करने के पहले उन्हें हटा दें(), आप खाली/दूषित संग्रह के साथ समाप्त हो सकते हैं।

0

मैंने कोड को उसी फ़ोल्डर में स्थानांतरित करके एक ही समस्या हल की जहां फ़ाइलों को मैं ज़िप संग्रह में जोड़ना चाहता था।