2013-11-23 5 views
6

का उपयोग कर फ़ाइलों को डाउनलोड करें मैं "अपलोड" नामक फ़ोल्डर से फ़ाइलों को ज़िप और डाउनलोड करने का प्रयास कर रहा हूं। ज़िप फ़ाइल डाउनलोड हो रही है लेकिन मैं इसे खोल नहीं सकता (निकालने)। मुझे एक त्रुटि मिल रही है जैसे "संग्रह अज्ञात प्रारूप में है या क्षतिग्रस्त है"।ज़िप और php

मुझे फ़ोल्डर को ज़िप करने के लिए निम्न कोड मिला है।

<?php 
    $files = "upload/".array('Dear GP.docx','ecommerce.doc'); 
    $zipname = 'filename.zip'; 
    $zip = new ZipArchive; 
    $zip->open($zipname, ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 
    header('Content-Type: application/zip'); 
    header('Content-disposition: attachment; filename=filename.zip'); 
    header('Content-Length: ' . filesize($zipfilename)); 
    readfile($zipname); 
?> 
+0

समस्या शायद '$ files =" अपलोड/"। सरणी ('प्रिय GP.docx', 'ecommerce.doc') से संबंधित है;'। त्रुटियों को प्रदर्शित करने का प्रयास करें और PHP त्रुटियों की जांच करें।आप एक सरणी के रूप में एक सरणी डालने की कोशिश कर रहे हैं। –

उत्तर

20

अपने जवाब के लिए धन्यवाद: प्रदर्शन त्रुटियों को चालू करें आप स्थानीय रूप से डिबग मदद करने के लिए।

<?php 
    $files = array('Dear GP.docx','ecommerce.doc'); 

    # create new zip opbject 
    $zip = new ZipArchive(); 

    # create a temp file & open it 
    $tmp_file = tempnam('.',''); 
    $zip->open($tmp_file, ZipArchive::CREATE); 

    # loop through each file 
    foreach($files as $file){ 

     # download file 
     $download_file = file_get_contents($file); 

     #add it to the zip 
     $zip->addFromString(basename($file),$download_file); 

    } 

    # close zip 
    $zip->close(); 

    # send the file to the browser as a download 
    header('Content-disposition: attachment; filename=Resumes.zip'); 
    header('Content-type: application/zip'); 
    readfile($tmp_file); 
?> 
+0

यह बहुत उपयोगी था, धन्यवाद! –

+0

धन्यवाद! ठीक काम करता है! –

+0

इस उत्तर के भाग को संपादित करें जो एक नया प्रश्न पूछ रहा था। [कृपया प्रश्न का उत्तर देने के लिए विशेष रूप से उत्तर का उपयोग करें] (// meta.stackoverflow.com/q/92107)। यदि आपके पास कोई नया प्रश्न है, तो कृपया [पूछें प्रश्न] (// stackoverflow.com/questions/ask) बटन पर क्लिक करके इसे पूछें। इस प्रश्न का एक लिंक शामिल करें यदि यह संदर्भ प्रदान करने में मदद करता है। – Mogsdad

0

बजाय $ zip-> addFile ($ फ़ाइल) का कोड नीचे का उपयोग करें;

<?php 
$zip->addFile($file_path, $filename); 
?> 
+0

यह मुद्दा नहीं है। '$ filename' एक [वैकल्पिक] है (http://www.php.net/manual/en/ziparchive.addfile.php) पैरामीटर –

+0

ठीक है। मैं फ़ाइल नाम का उपयोग कर ज़िप फ़ाइल बना रहा हूं, इसलिए मैं फ़ाइल विकल्प और फ़ाइल नाम दोनों विकल्प का सुझाव देता हूं। –

0
$files = "upload/".array('Dear GP.docx','ecommerce.doc'); 

होना चाहिए:

$files = array('upload/Dear GP.docx','upload/ecommerce.doc'); 

आप अभी भी मुद्दों कर रहे हैं तो आप यदि आप वर्तमान निर्देशिका के लिए लिखने की अनुमति की जाँच करनी चाहिए। फ़ाइल को वास्तव में लिखा गया था या नहीं, यह जांचने के लिए आप close() के वापसी मूल्य की जांच कर सकते हैं।

$res = $zip->close(); 
var_dump($res); 

उत्पादन bool(true) अगर लिखने सफल रहा था होना चाहिए।

ऐसा लगता है कि आप भी filesize() कॉल में एक गलत वर नाम है:

header('Content-Length: ' . filesize($zipfilename)); 

शायद होना चाहिए:

header('Content-Length: ' . filesize($zipname)); 

तुम भी जाँच करने के लिए फ़ाइलों को आप कर रहे हैं कि क्या अतिरिक्त सत्यापन जोड़ सकता है वास्तव में ज़िप में जोड़ने और ज़िप भेजने की जांच करने से पहले मौजूद है।

संपादित करें:

ini_set('display_errors', 1); 
error_reporting(E_ALL); 
2

मैं पर मेरे मैक (स्थानीय होस्ट) इस डाउनलोड ज़िप फ़ाइलों पर 6 घंटे से अधिक खर्च किया था - हालांकि फ़ाइल डाउनलोड हो रही किया गया था, मैं उन्हें (हो रही cpgz फ़ाइलें) अनज़िप नहीं कर सका। जाहिर है, स्टैक ओवरफ़्लो में उल्लिखित समाधानों में से कोई भी नहीं (ज़िप फ़ाइल डाउनलोड पर विभिन्न प्रकार के प्रश्नों के आसपास) काम किया। अंत में, परीक्षण और त्रुटि के बाद, मैंने पाया कि निम्न कोड काम करता है:

किसी भी व्यक्ति ने पहले उत्तर दिया था ob_start() और जहां आपको इसे रखना चाहिए। वैसे भी, वह अकेला जवाब नहीं था - आपको ob_start() से ऊपर की उन तीन पंक्तियों का उपयोग करने की आवश्यकता है।

$file=$zippath.$filename; 
if (headers_sent()) { 
    echo 'HTTP header already sent'; 
} else { 
    if (!is_file($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
     echo 'File not found'; 
    } else if (!is_readable($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
     echo 'File not readable'; 
    } else { 
     while (ob_get_level()) { 
      ob_end_clean(); 
     } 
     ob_start(); 
     header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
     header("Content-Type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-Length: ".filesize($file)); 
     header('Pragma: no-cache'); 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
     ob_flush(); 
     ob_clean(); 
     readfile($file); 
     exit; 
    } 
} 
+0

को स्ट्रिप्स करता है, जहां तक ​​मुझे पता है (गलत हो सकता है) लाइन ob_end_clean() को कैशिंग के साथ कुछ करना है, क्योंकि बड़ी फ़ाइलों को कैश द्वारा गड़बड़ कर दिया जाएगा। – Skytiger

0

उत्तर अच्छा है लेकिन कृपया हेडर से पहले इन पंक्तियों को जोड़ें। ज़िप फ़ाइल (Winzip, WinRar आदि)

if (headers_sent()) 
    { 
     // HTTP header has already been sent 
     return false; 
    } 
// clean buffer(s) 
while (ob_get_level() > 0) 
    { 
     ob_end_clean(); 
    } 
0
$zip = new ZipArchive; 
     if ($zip->open('assets/myzip.zip', ZipArchive::CREATE)) { 
      $zip->addFile('folder/bootstrap.js', 'bootstrap.js'); 
      $zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js'); 
      $zip->close(); 
      echo 'Archive created!'; 
      header('Content-disposition: attachment; filename=files.zip'); 
      header('Content-type: application/zip'); 
      readfile($tmp_file); 
     } else { 
      echo 'Failed!'; 
     } 

मैं एक फ़ोल्डर से फ़ाइलों को डाउनलोड करने के लिए इस कोड को मिला सभी जिप सॉफ्टवेयर में खुला है।

संबंधित मुद्दे