2008-10-15 7 views
8

मैं grails वेबसाइट से फ़ाइल अपलोड कोड अनुकरण करने की कोशिश कर रहा हूं, और मैं कुछ समस्याओं में भाग रहा हूं। मैं उसी कोड का उपयोग कर रहा हूं जैसा कि here पाया गया है।Grails फ़ाइल अपलोड समस्याएं

<g:form action="upload" method="post" enctype="multipart/form-data"> 
     <input type="file" name="myFile" /> 
     <input type="submit" value="Upload" /> 
    </g:form> 

और

def upload = { 
    def f = request.getFile('myFile') 
    if(!f.empty) { 
     flash.message = 'success' 
    }  
    else { 
     flash.message = 'file cannot be empty' 
    } 
} 

मैं कार्यावधि में निम्न त्रुटि प्राप्त कर रहा हूँ:

Message: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"} 
Caused by: groovy.lang.MissingMethodException: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"} 

यह कुछ वसंत विन्यास के लिए संबंधित प्रतीत होता है यहाँ मेरी कोड है। वसंत MultipartHttpServletRequest इंजेक्शन नहीं लग रहा है, इसलिए मेरे अनुरोध में उचित विधि नहीं है। मैंने अभी grails create-app का उपयोग करके इस एप्लिकेशन को बनाया है। मैंने resource.groovy फ़ाइल को संशोधित नहीं किया है। मैं grails 1.0.3 का उपयोग कर रहा हूँ।

किसी भी मदद की बहुत सराहना की जाती है। Grails वेबसाइट इस देखो को इतना आसान बनाता है।

उत्तर

12

समस्या हल हो गई!

मैं संभवतः मूल लेखक की तुलना में अलग-अलग Grails में फ़ाइलों को अपलोड करने के लिए उदाहरण कोड का उपयोग कर रहा था। समस्या यह है कि जब नियंत्रक की विधि को अपलोड किया गया था, तो यह कभी-कभी अपलोड पृष्ठ के मूल प्रस्तुत करने के लिए होता था। उस विधि में अनुरोध multipartHttpServletRequest प्रकार का नहीं था। जब मैंने अपलोड करने के लिए अपनी फाइल के साथ एक पोस्ट किया, तो वसंत ने सही चीज की और मल्टीपार्ट एचटीपीएसर्लेट रिवेस्ट को अपना अनुरोध बदल दिया। इसलिए, मुझे अपने अनुरोध का उपयोग करने से पहले मेरे अद्यतन नियंत्रक विधि में एक सरल जांच करने की आवश्यकता है जैसे मल्टीपार्टहट्प सर्वेटरक्वैस्ट।

if(request instanceof MultipartHttpServletRequest) 
{ 
    MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request; 
    CommonsMultipartFile f = (CommonsMultipartFile) mpr.getFile("myFile"); 
    if(!f.empty) 
    flash.message = 'success' 
    else 
    flash.message = 'file cannot be empty' 
} 
else 
    flash.message = 'request is not of type MultipartHttpServletRequest' 
+0

ओह, हाँ .... आप कभी भी इस तरह की चीज़ के लिए पोस्ट को अनुमति नहीं दे सकते और उसी क्रिया बंद होने से प्राप्त नहीं करना चाहते हैं। – billjamesdev

+0

अगर कोई यह जांचने के लिए देख रहा है कि यह कैसे एक अच्छा लिंक है http://roshandawrani.wordpress.com/2011/02/03/grails-mock-testing-a-file-upload/ रोशन के लिए धन्यवाद – rsilva4

4

आप एचटीएमएल (से अपलोड करने के लिए फार्म के साथ अपने जीएसपी) को अद्यतन enctype है के रूप में वे बताते हैं सुनिश्चित करें:

<g:form action="upload" method="post" enctype="multipart/form-data"> 

आशा है कि उपयोगी है, बहुत स्पष्ट लगता है, लेकिन यह तो मेरा पहला विचार है आपका त्रुटि संदेश देखने के बाद।

+0

मेरे पास यह है लेकिन यह अभी भी काम नहीं करता है। मैंने अपना मूल कोड उपरोक्त मेरे मूल पोस्ट में जोड़ा है। – anschoewe

+0

धन्यवाद, अपना अपडेट देखें ... खोदने की कोशिश कर रहा है ... क्या यह डर है कि अनुरोध जेटी विशिष्ट है और न केवल एक HttpRequest ... – codeLes

+0

मान्य है कि मैं Grails के लिए नया हूँ। मुझे लगता है कि जब से मैं जेटी का उपयोग कर अपना ऐप चला रहा था, जेटी टाइप के अनुरोध के लिए यह सामान्य था। – anschoewe

2

कोई here आपके जैसा ही समस्याएं प्रतीत होता है। वह कहता है कि उसने इसे "तय" किया:

हल हो गया। यह मेरी गलती थी, मैं फ़ॉर्म जमा करने से पहले कार्रवाई में जा रहा था, इसलिए मुझे लगता है कि कोई फ़ाइल नहीं थी।

यह सुनिश्चित नहीं है कि उसने क्या कहा है, लेकिन शायद यह आपकी मदद करेगा।

+0

ने देखा कि, लेकिन यह नहीं पता था कि इसे कैसे संवाद करें ... एक और लड़का कहता है कि उसने साफ किया और अपने कैश को साफ़ कर दिया और यह काम किया ... इसके बारे में निश्चित नहीं है ...लेकिन यह किसी भी तरह से उनके लिए काम किया – codeLes

+0

मुझे यकीन नहीं है कि मैं जमा करने से पहले कार्रवाई में कैसे जाता हूं। क्या संभव है? मैंने अपने अनुप्रयोगों को साफ कर लिया है (grails साफ), लेकिन मुझे नहीं पता कि कैसे कैश साफ़ करने के लिए। – anschoewe

4
Grails 2.x उपयोग के साथ

अब:

<g:uploadForm name="upload" action="upload" method="POST"> 
    <input type="file" name="file" /> 
</g:uploadForm> 

def upload = { 
    def file = request.getFile('file') 
    assert file instanceof CommonsMultipartFile 

    if(!file.empty){ //do something } 
    else { //do something } 
} 

अधिक, स्वच्छ और अधिक सरल।