2015-10-15 6 views
9

मैं कुछ पाठ पोस्ट करने और फ़ाइल अपलोड करने के लिए लैरवेल 5.1 में एक फॉर्म का उपयोग कर रहा हूं। यह इस (सरलीकृत संस्करण) की तरह दिखता है:लैरवेल 5.1: अपलोड की गई फ़ाइल को पुराने इनपुट के रूप में रखें

{!! Form::open(array('url' => 'foo/bar')) !!} 
    {!! Form::text('image_name') !!} 
    {!! Form::file('image') !!} 
    {!! Form::submit('Submit!') !!} 
{!! Form::close() !!} 

पाठ फ़ील्ड की आवश्यकता है, इसलिए मैं अपने नियंत्रक में एक $validator गयी। अगर सत्यापन विफल रहता है, तो उपयोगकर्ता को वापस फॉर्म पर रीडायरेक्ट किया जाता है। मैं फार्म फिर से आबाद करने के लिए withInput() विधि का उपयोग करें ताकि उपयोगकर्ता में फिर से भरने के लिए नहीं है:

if ($validator->fails()) { 
    return redirect()->back()->withInput(); 
} 

यह textfields, ड्रॉपडाउन आदि के लिए पुराने इनपुट मिल जाएगा लेकिन उपयोगकर्ता अपलोड की है एक फ़ाइल, सत्यापन विफल होने पर फ़ाइल चयन समाप्त हो गया है और इसे फिर से चुना जाना है। क्या पुराने चयन के रूप में फाइल चयन को याद रखने के लिए लार्वेल में कोई रास्ता है?

धन्यवाद!

+1

मुझे नहीं लगता कि आप केवल लैरवेल में ही नहीं बल्कि सामान्य रूप से - सुरक्षा/जटिलता के कारणों के लिए कर सकते हैं। –

उत्तर

17

नहीं, file इनपुट लार्वेल द्वारा या किसी भी सॉफ्टवेयर द्वारा पूर्ववत नहीं किया जा सकता है। आपकी वेबसाइट (और कोई भी वेबसाइट) फ़ाइल के स्थानीय पथ को नहीं जानती और नहीं जानी चाहिए। सुरक्षा जोखिमों की कल्पना करो अगर उन्होंने किया! आप किसी उपयोगकर्ता को अपनी एसएसएच निजी कुंजी या कुछ अपलोड करने में ट्रिक कर सकते हैं।

आपको अपलोड करने की आवश्यकता है, भले ही अपलोड की गई त्रुटियां हों, भले ही अपलोड की गई त्रुटियां हों।

फिर आप इसे pending स्थिति के साथ अपने डेटाबेस में संग्रहीत कर सकते हैं, या उपयोगकर्ता के सत्र में संग्रहीत hash मिलान के साथ इसे असाइन किया गया कुछ अद्वितीय hash है। बिंदु इस विशिष्ट उपयोगकर्ता से संबंधित अपूर्ण अपलोड की पहचान करने में सक्षम होना है।

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

एक बार फॉर्म सही तरीके से सबमिट हो जाने के बाद सत्र hash सत्र साफ़ करें या complete पर डेटाबेस स्थिति अपडेट करें; जो भी आपको करने की ज़रूरत है।

+0

इस स्पष्ट उत्तर के लिए धन्यवाद; इससे बहुत कुछ बोध होता है। मैं अपलोड किए गए फ़ाइल को संसाधित करने के लिए आवश्यक तर्क को देखूंगा। – elton73

2

इसी मुद्दे के लिए बहुत सारे प्रश्न हैं (Form::file: How to repopulate with Input::old After Validation Errors and/or on Update?) और स्पष्ट ज्ञान वाले सभी लोग कहते हैं कि यह संभव नहीं है।

मैं एक वैकल्पिक हल कि निम्नलिखित लक्ष्यों को शामिल किया गया proppose होगा:

  • रखें प्रपत्र डेटा और विफल Laravel मान्यता केवल
  • उपयोग सर्वर साइड सत्यापन के मामले में इनपुट फ़ाइल। आप की आवश्यकता नहीं है जावास्क्रिप्ट सत्यापन का उपयोग कभी नहीं करना चाहिए।

इसका कीवर्ड AJAX है।( प्राप्त पोस्ट विधि) एक एकल AJAX पोस्ट

  1. द्वारा सभी क्षेत्रों और संलग्न फाइल भेजें एक AJAX फ़ॉर्म बनाएं कि शामिल हैं:

    दिसंबर 2017 अद्यतन: मैं निम्नलिखित करना होगा सब कुछ को छोड़कर फ़ाइल इनपुट सहित। याद रखें कि इसे लार्वेल सीएसआरएफ टोकन भेजने की आवश्यकता है।

  2. नियंत्रक मान्यता आप एक JSON उत्पादन बनाने के लिए अपनी प्रतिक्रियाओं बनाने के लिए (विफल रहा है या सफलता) की जरूरत में, तो अपने AJAX कोड भेज किसी भी मामले में प्रतिक्रिया प्राप्त कर सकते हैं, और फिर आप अपने ब्राउज़र में यह दिखा सकते हैं

इस तरह आप अपने सर्वर में किसी भी अस्थायी स्थिति में फ़ाइलों को रखने से बचते हैं।

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

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