PHP

2010-06-20 8 views
16

में ज़िप स्ट्रीम मेरे पास एक PHP स्क्रिप्ट है जो फ्लाई पर एक ज़िप फ़ाइल बनाता है और ब्राउज़र को ज़िप फ़ाइल डाउनलोड करने के लिए मजबूर करता है। सवाल यह है: क्या मैं सीधे ज़िप फ़ाइल को एक आउटपुट स्ट्रीम में लिख सकता हूं जो उपयोगकर्ता के ब्राउज़र से पहले सर्वर पर वास्तविक फ़ाइल के रूप में सहेजने के बजाय जुड़ा हुआ है और फिर फ़ाइल भेज सकता है?PHP

अग्रिम धन्यवाद।

+1

इस सवाल का जवाब यहाँ है: http://stackoverflow.com/a/4357904/416630 – Lee

उत्तर

5

यदि आप zip extension का उपयोग कर रहे हैं, तो उत्तर "नहीं" लगता है। close method in the ZipArchive class एक लिखने को ट्रिगर करता है, और ऐसा लगता है कि यह एक फ़ाइल को लिखना चाहता है। आप को फ़ाइल को अनुकरण करने के लिए Streams का उपयोग करके कुछ भाग्य प्राप्त कर सकते हैं, लेकिन फिर आप पूरी चीज़ को स्मृति में रखते हैं, और आप इसे तब तक नहीं भेज सकते जब तक आप फ़ाइलों को जोड़ नहीं लेते।

आप समय समाप्ति या अन्य समस्याओं के साथ समस्या हो रही है, जबकि ज़िप फ़ाइल के लिए एक उपयोगकर्ता इंतजार कर रहा बनाया जाना, एक बहु कदम डाउनलोड की प्रक्रिया का प्रयास करें:

  1. उपयोगकर्ता की पसंद जो कुछ भी वे बनाने के लिए लेने ज़िप
  2. उन्हें एक ऐसे स्थिति पृष्ठ पर ले जाया जाता है जो वास्तव में पृष्ठभूमि में ज़िप फ़ाइल बनाने के लिए AJAX कॉल का उपयोग करता है। एक सुंदर, विचलित एनीमेशन अपना ध्यान रखना चाहिए।
  3. पृष्ठभूमि प्रक्रियाओं के बाद ज़िप बनाने के बाद, उपयोगकर्ता को उस स्क्रिप्ट पर रीडायरेक्ट किया जाता है जो फ़ाइल को डाउनलोड/रीडायरेक्ट करता है।
-1

नहीं, आपको here में एक अस्थायी फ़ाइल का उपयोग करना होगा।

11

अपने वेब सर्वर लिनक्स चल रहा है, तो आप इसे एक अस्थायी फ़ाइल उत्पन्न जा रहा है बिना स्ट्रीमिंग कर सकते हैं। Win32 के तहत आपको सिगविन या कुछ समान उपयोग करने की आवश्यकता हो सकती है।

यदि आप ज़िप फ़ाइल नाम के रूप में "-" का उपयोग करते हैं, तो यह stdout को संपीड़ित करेगा। वहां से, popen() का उपयोग करके उस स्ट्रीम को रीडायरेक्ट करना काफी आसान है। "-q" तर्क बस सामान्य रूप से स्थिति पाठ को आउटपुट करने के लिए ज़िप को बताता है। अधिक जानकारी के लिए ज़िप (1) मैनपेज देखें।

<? 
    $zipfilename = "zip_file_name.zip"; 

    if(isset($files)) unset($files); 

    $target = "/some/directory/of/files/you/want/to/zip"; 

    $d = dir($target); 

    while(false !== ($entry = $d->read())) 
    { 
     if(substr($entry, 0, 1) != "." && !is_dir($entry)) 
     { 
     $files[] = $entry; 
     } 
    } 

    header("Content-Type: application/x-zip"); 
    header("Content-Disposition: attachment; filename=\"$zipfilename\""); 

    $filespec = ""; 

    foreach($files as $entry) 
    { 
     $filespec .= "\"$entry\" "; 
    } 

    chdir($target); 

    $stream = popen("/usr/bin/zip -q - $filespec", "r"); 

    if($stream) 
    { 
     fpassthru($stream); 
     fclose($stream); 
    } 
?> 
1

हाँ, आप सीधे इस Git प्रतिनिधि का उपयोग कर ग्राहक के लिए ज़िप स्ट्रीम कर सकते हैं: Zip Stream Large Files

+0

विंडोज के तहत काम नहीं करने लगता है – Jerry

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

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