2017-07-07 14 views
9

मेरे पास एक लार्वा 5.4 ऐप है जहां प्रमाणीकृत उपयोगकर्ताओं को एस 3 स्टोरेज से निजी फाइलें डाउनलोड करने में सक्षम होना चाहिए। मैंने निजी फ़ाइल डाउनलोड की अनुमति देने के लिए एक मार्ग और नियंत्रक स्थापित किया है।लार्वेल 5 फ़ाइल डाउनलोड: स्ट्रीम() या डाउनलोड()

कोड इस तरह दिखता है:

रूट:

नियंत्रक:

public function download($fileName) 
{ 
    if (!$fileName || !Storage::exists($fileName)) { 
     abort(404); 
    } 

    return response()->stream(function() use ($fileName) { 
     $stream = Storage::readStream($fileName); 
     fpassthru($stream); 
     if (is_resource($stream)) { 
      fclose($stream); 
     } 
    }, 200, [ 
     'Cache-Control'   => 'must-revalidate, post-check=0, pre-check=0', 
     'Content-Type'   => Storage::mimeType($fileName), 
     'Content-Length'  => Storage::size($fileName), 
     'Content-Disposition' => 'attachment; filename="' . basename($fileName) . '"', 
     'Pragma'    => 'public', 
    ]); 
} 

सभी ठीक काम कर रहा है, लेकिन जब मैं Laravel docs को करीब से देखने के लिए किया था, मुझे लगता है कि पाया वे बस response()->download() के बारे में बात करते हैं।

अगर मैं प्रतिक्रिया उस तरह लागू, मेरे कोड इस तरह दिखेगा:

public function download($fileName) 
{ 
    if (!$fileName || !Storage::exists($fileName)) { 
     abort(404); 
    } 

    $file = Storage::get($fileName); 

    return response()->download($file, $fileName, [ 
     'Content-Type' => Storage::mimeType($fileName), 
    ]); 
} 

दोनों कार्यों API docs में पाया जा सकता।

मेरा प्रश्न: जाने का पसंदीदा तरीका क्या होगा और प्रत्येक के फायदे/नुकसान क्या हैं?

मैं अब तक क्या एकत्रित की हैं से

:

स्ट्रीम:

  • पूरी फ़ाइल की आवश्यकता नहीं है स्मृति में लोड करने के लिए
  • बड़ी फ़ाइलों
के लिए उपयुक्त

डाउनलोड:

  • कम कोड आवश्यक है
+0

इसके लिए धन्यवाद! –

+0

@ jones03 इस उत्तर को देखें https://stackoverflow.com/a/24008078 – Qh0stM4N

उत्तर

1

जब आप Laravel response() सहायक कहते हैं, यह Illuminate\Routing\ResponseFactory का एक उदाहरण देता है। ResponseFactory में इन दो विधियों हैं: download और stream - प्रश्न में दो विधियां। यदि आप थोड़ा गहरा खोदते हैं, तो आप देखेंगे कि download\Symfony\Component\HttpFoundation\BinaryFileResponse का एक उदाहरण देता है, जबकि stream\Symfony\Component\HttpFoundation\StreamedResponse देता है - ये दोनों सिम्फनी घटक हैं।

यहां कोड के माध्यम से खोदना आवश्यक नहीं है, लेकिन यह समझना अच्छा है कि हुड के नीचे क्या हो रहा है। अब जब हम जानते हैं कि लौटाई गई अंतर्निहित वस्तुएं सिम्फनी HTTP घटक से हैं, तो हम सिम्फनी दस्तावेज़ों से परामर्श ले सकते हैं और देख सकते हैं कि वे किस प्रकार उपयोग करने की अनुशंसा करते हैं। आम तौर पर, स्ट्रीम का उपयोग तब किया जाता है जब फ़ाइल का आकार अज्ञात होता है, जैसे कि जब आप फ्लाई पर फ़ाइल उत्पन्न कर रहे हों। अधिकांश अन्य मामलों में, download विधि द्वारा उत्पन्न BinaryFileResponse आपकी आवश्यकताओं के लिए पर्याप्त होगा।

आप HTTP स्ट्रीमिंग और उसके उपयोग मामलों here के अधिक गहराई से स्पष्टीकरण पर एक नज़र डाल सकते हैं।

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