2012-12-14 36 views
6

मेरे पास एंड्रॉइड में क्लाइंट एप्लिकेशन है जो सर्वर पर फ़ाइलों को भेजने के लिए HttpURLConnection का उपयोग करता है। फॉर्म-डेटा मानों को पार्स करने के लिए सर्वर Apache Commons FileUpload API का उपयोग करता है।ServletFileUpload # parseRequest (अनुरोध) एक खाली सूची देता है

-----------------------------4912995119421 
Content-Disposition: form-data; name="deviceid" 

9428103 
-----------------------------4912995119421 
Content-Disposition: form-data; name="countryid" 

598 
-----------------------------4912995119421 
Content-Disposition: form-data; name="number" 

98621360 
-----------------------------4912995119421 
Content-Disposition: form-data; name="file"; filename="2012-12-08 17.42.18.jpg" 
Content-Type: image/jpeg 

ÿØÿá1 Exif II*  
     @  °  ª  
    ²    ¼  Ä (  1 Ì 2 Ø   i‡ ì %ˆ \ n SAMSUNG GT-S5360L H  H  S5360LUHLB1 2012:12:08 17:42:18 š‚ î ?‚ ö "ˆ  'ˆ È ? 0220? þ ?  ‘  ’ & ’  
’ .   0100     @   °   > £  ¤  ¤  ¤ 6 ¤      
    2012:12:08 17:42:18 2012:12:08 17:42:18  
    d    R98  0100       (   ¤  T.  ÿØÿà JFIF  ÿÛ C @@ÿÛ 
-----------------------------4912995119421-- 

सर्वर कोड:

String contentType = request.getContentType(); 
    if ((contentType.indexOf("multipart/form-data") == -1)) { 
     response.setStatus(HttpServletResponse.SC_NOT_FOUND); 
     return; 
    } 


    long maxFileSize = (2 * 1024 * 1024); 

    int maxMemSize = (2 * 1024 * 1024); 

    DiskFileItemFactory factory = new DiskFileItemFactory(); 
    // maximum size that will be stored in memory 
    factory.setSizeThreshold(maxMemSize); 

    // Create a new file upload handler 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    // maximum file size to be uploaded. 

    upload.setSizeMax(maxFileSize); 

    List fileItems = upload.parseRequest(request); 
    Iterator i = fileItems.iterator(); 


    //leo primero todas las variables. 

    int deviceID = 0; 
    int countryID = 0; 
    String phoneNumber = ""; 



    while (i.hasNext()) { 
     FileItem fi = (FileItem) i.next(); 

     if (fi.isFormField()) { 
      String variable = fi.getFieldName(); 
      if (variable.equals("deviceid")) { 
       deviceID = Integer.parseInt(fi.getString()); 
      } else if (variable.equals("countryid")) { 
       countryID = Integer.parseInt(fi.getString()); 
      } else if (variable.equals("number")) { 
       phoneNumber = String.valueOf(Long.parseLong(fi.getString())); 
      } 

     } 

    } 

    if (deviceID == 0 || countryID == 0 || phoneNumber.equals("")) { 
     response.setStatus(HttpServletResponse.SC_NOT_FOUND); 
     return; 
    } 

समस्या लाइन List fileItems = upload.parseRequest(request); में है

HttpURLConnection इस अनुरोध को भेजता है। लौटाई गई सूची खाली है और मुझे फॉर्म-डेटा मान नहीं मिल सकते हैं।

उत्तर

24

यह उस बिंदु पर खाली होगा यदि आपने पहले ही (निश्चित रूप से) अनुरोध निकाय को पहले से पार्स किया है। HTTP अनुरोध निकाय को को केवल पर पढ़ा/पार्स किया जा सकता है (जैसा क्लाइंट ने इसे केवल एक बार भेजा है और इसे कई बार नहीं भेजेगा)।

अनुरोध शरीर परोक्ष पढ़ने/पार्स आप निम्न विधियों में से किसी भी लागू किया जाएगा जब है से पहले कॉमन्स FileUpload के लिए अनुरोध खिला:

request.getParameter(); 
request.getParameterMap(); 
request.getParameterNames(); 
request.getParameterValues(); 
request.getReader(); 
request.getInputStream(); 

आप बिल्कुल यकीन है कि तुम नहीं हैं बनाने की जरूरत है पहले से किसी भी विधि को कॉल करना (सुनिश्चित करने के लिए सभी सर्वलेट फ़िल्टर भी जांचें)।

यदि आप पहले से ही यह सुनिश्चित कर चुके हैं कि आप ऐसा नहीं कर रहे हैं, तो केवल अन्य संभावित कारण गलत सीमा शीर्षलेख होंगे और/या गलत न्यूलाइन का उपयोग करेंगे (यह वास्तव में सीआर + एलएफ होना है और इस प्रकार अकेले एलएफ नहीं है)। आप "फाइल अपलोड करने" अनुभाग के तहत Using java.net.URLConnection to fire and handle HTTP requests के नीचे एक ठोस और उचित उदाहरण पा सकते हैं।

+0

मैं का उपयोग कर जांच की गई: request.getInputStream() बाइट [] एक = नए बाइट [8096]; int आर = 0; ServletInputStream s = request.getInputStream(); स्ट्रिंग सी = ""; जबकि ((आर = एस.एड (ए))! = -1) { सी + = नया स्ट्रिंग (ए) .substring (0, आर); } और डेटा ठीक मिला। समस्या यह है कि कमांड फ़ाइल अपलोड सामग्री को पार्स नहीं कर सकता है। – toto

+0

ठीक है, अगर आप उस 'request.getInputStream()' कॉल को हटाते हैं, तो इसे ठीक से काम करना चाहिए, जैसा कि मेरे उत्तर में समझाया गया है। – BalusC

+0

ठीक है, मुझे लगता है कि आप पहले से किसी भी तरीके से कॉल नहीं कर रहे हैं। इस समस्या का तब मतलब हो सकता है कि आपने उचित सीमा शीर्षलेख सेट नहीं किया है, या जब आपने गलत न्यूलाइन का उपयोग किया था। आप "फाइल अपलोड करने" अनुभाग के तहत http://stackoverflow.com/a/2793153 के नीचे एक ठोस और उचित उदाहरण पा सकते हैं। – BalusC

0

मैं इस समस्या में भी भाग रहा था, लेकिन मुझे कुछ भी नहीं मिला जो विशेष रूप से अनुरोध ऑब्जेक्ट को पढ़ने से संबंधित था।

@MultipartConfig(
    location="/tmp", 
    fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, 
    maxRequestSize=1024*1024*5*5 
) 

जाहिर है जब मैं getParts() का उपयोग कर, मैं इस दूर करने के लिए भूल गया द्वारा अनुरोध को पढ़ने के लिए कोशिश कर रहा था: मैं अंत में यह इस ब्लॉक को हटाने के द्वारा काम करने के लिए मिला है। मैं जावा के लिए थोड़ा नया हूं, इसलिए मुझे ServletFileUpload # parseRequest के साथ इस संघर्ष को नहीं पता था। वैसे भी, एक बार जब मैं इससे छुटकारा पाता हूं, तो parseRequest ने सरणी को सही ढंग से वापस कर दिया।

1

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

imports: 
import org.apache.tomcat.util.http.fileupload.FileItem; 
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; 
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; 

खेद मेरी अंग्रेजी

1

वसंत प्रयोग किया जाता है, अगर कोई xml फ़ाइल में एक <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> की जाँच करें। एक समारोह

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException { 
     if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) { 
      if (request instanceof MultipartHttpServletRequest) { 
       logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " + 
         "this typically results from an additional MultipartFilter in web.xml"); 
      } 
      else { 
       return this.multipartResolver.resolveMultipart(request); 
      } 
     } 
     // If not returned before: return original request. 
     return request; 
    } 

मल्टीपार्ट आइटम "खाता है"। यह तीन घंटे दर्द का कारण बनता है।

+0

<3 देख सकते हैं .... धन्यवाद ... आप मुझे बचाओ। – Cataclysm

-1

मेरी समस्या अपाचे संदर्भ है।मेरी linux सर्वर पर XML संदर्भ

allowCasualMultipartParsing="true" होता है और मेरी HttpServlet

@MultipartConfig(fileSizeThreshold=1024*1024*2,maxFileSize=1024*1024*50,maxRequestSize=1024*1024*50) 

शामिल मैं इसे फिर हटाएं इसे सही ढंग से काम कर रहा है। आशा है कि यह आपकी मदद करेगा।