9

में असीमित फ़ाइल अपलोड अपलोड करें जो मैं कर रहा हूं। मैं अपने स्प्रिंग वेब ऐप में अजाक्स के माध्यम से मल्टीपार्ट फ़ाइल अपलोड करना चाहता हूं। जब सर्वर POST अनुरोध प्राप्त करता है, तो यह डेटाबेस में एक टिकट संख्या बनाता है। यह तब एक धागा शुरू करता है जो वास्तविक फ़ाइल अपलोड को संभालता है। सर्वर फिर टिकट नंबर देता है।वसंत

मैं अनुरोध को संभालने के लिए CommonsMultipartResolver का उपयोग कर रहा हूं और मैंने संकल्प को स्पष्ट रूप से ध्वजांकित किया है ताकि मल्टीपार्ट को तुरंत हल नहीं किया जा सके।

तो यहाँ मैं क्या

@Controller 
public class myController{ 

    @RequestMapping(value = "/upload", method = RequestMethod.POST) 
    @ResponseStatus(value = HttpStatus.OK) 
    @ResponseBody 
    public String upload(MultipartHttpServletRequest request, String fileName){ 

     String ticket = dao.createUploadTicket(fileName); 
     Runnable run = new Runnable(){ 

      @Override 
      public void run(){ 

       dao.writeUpdate(ticket, "Getting data from request"); 
       final MultipartFile file = request.getFile("theFile"); 
       dao.writeUpdate(ticket, "Multipart file processed"); 
       try { 
        dao.writeUpdate(ticket, "Saving file to disk"); 
        file.transferTo(new File("/myDirectory")); 
        dao.writeUpdate(ticket, "File saved to disk"); 
       } 
       catch(Exception e){ 
        dao.writeUpdate(ticket, "File upload failed with the exception " + e.toString()); 
       } 
      } 
     }; 
     Thread t = new Thread(run); 
     t.start(); 
     return ticket; 
    } 
} 

है की तर्ज पर कुछ तो यहां मुद्दा यह है कि टिकट नंबर प्रगति अद्यतन प्राप्त करने के लिए किया जा सकता है। कहें कि एक बड़ी फाइल अपलोड की जा रही है। जिस ग्राहक ने फ़ाइल अपलोड पोस्ट किया है (इस उदाहरण में एक अजाक्स अनुरोध कहें) इसे अतुल्यकालिक रूप से कर सकता है और टिकट नंबर वापस ले सकता है। क्लाइंट उस टिकट नंबर का उपयोग फ़ाइल अपलोड करने के चरण को निर्धारित करने और किसी अन्य पृष्ठ में जानकारी प्रदर्शित करने के लिए कर सकता है।

एक अन्य इस्तेमाल होता है मुझे लगता है कि सभी टिकट नंबर के लिए सर्वर के लिए अनुरोध करता है एक HTML पृष्ठ हो सकता है, तो सभी फ़ाइल अपलोड कि सर्वर पर काम चल रहा है की एक "लाइव" दृश्य दिखाता है।

मैं इसे काम करने में सक्षम नहीं हूं क्योंकि जैसे ही नियंत्रक लौटाता है, वसंत CommonsMultipartResolver में cleanupMultipart() को कॉल करता है। चूंकि संकल्प Lazily ध्वज गलत पर सेट है, जब cleanupMultipart() कहा जाता है, यह multipart फ़ाइलों को हल करने और शुरू करने के लिए शुरू हो जाएगा। इससे "request.getFile (" theFile ") पर कॉल के बीच दौड़ की स्थिति होती है;" रननेबल और क्लीनअप में मल्टीपार्ट() कॉल अंततः एक अपवाद का कारण बनता है।

किसी के पास कोई विचार है? क्या मैं बैक-एंड एसिंक्रोनस फ़ाइल हैंडलिंग करने के लिए यहां कुछ प्रकार के HTTP अनुबंध को तोड़ रहा हूं।

+0

Commention। मुझे निम्नलिखित ब्लॉग मिले जो समाधान के साथ आने में मदद कर सकते हैं। http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-support/ https://blogs.oracle.com/ enterprisetechtips/entry/asynchronous_support_in_servlet_3 यदि मैं एक कामकाजी उदाहरण के साथ आता हूं तो मैं वापस पोस्ट करूंगा। – CAL5101

उत्तर

5

HTTP अनुरोध पहले से ही अपने थ्रेड में निष्पादित किया गया है, और क्लाइंट समानांतर, असीमित रूप से कुछ अनुरोध कर सकता है। तो आपको एक नया धागा शुरू करने की जरूरत नहीं है। मुख्य धागे में सामान्य रूप से फ़ाइल को सहेजें/संसाधित करें। केवल 'async फ़ाइल अपलोड करें' केवल ग्राहक पक्ष पर अपलोड करें।

इसके अलावा, आपको इनपुट को संसाधित करते समय केवल http प्रतिक्रिया भेजनी चाहिए। मेरा मतलब है कि आप इनपुट हेडर नहीं पढ़ सकते हैं, एक http प्रतिक्रिया बना सकते हैं, और ब्राउज़र से डेटा पढ़ना जारी रख सकते हैं। इनपुट का उपभोग करें -> इसे संसाधित करें -> आउटपुट भेजें, कि HTTP 1/1.1 प्रोटोकॉल कैसे काम करता है।

आप एक टिकट नंबर की जरूरत है अपलोड करने के लिए भेजने के लिए, आप इसे वास्तविक अपलोड करने से पहले, एक दो चरणों अपलोड का उपयोग कर, की तरह से बना सकते हैं:

  • अजाक्स टिकट नंबर
  • पोस्ट एक पाने के लिए अनुरोध प्राप्त फ़ाइल सामग्री और टिकट नंबर (पिछले चरण से प्राप्त)
  • + ajax प्राप्त वर्तमान स्थिति अपने ही पोस्ट पर, टिकट के लिए मिलता है, कभी भी बाद में async
+0

सहमत हैं।मैं बस थोड़ा स्पष्टीकरण जोड़ना चाहता हूं: क्या उपयोगकर्ता 1404399 पूछ रहा है कि सर्वर पक्ष पर एक नए थ्रेड द्वारा "async अपलोड" कैसे करें, जबकि इस समस्या को संभालने का सही तरीका है जावास्क्रिप्ट द्वारा एजेक्स पोस्ट को हैंडल-अपलोडिंग एक्शन में बनाना है, और किसी अन्य कार्रवाई पर मतदान करके उपयोगकर्ता को प्रगति की रिपोर्ट करें। क्या यह आपका विचार है? –

+0

@ होआंगलांग सही –

+0

उत्तर लोगों के लिए धन्यवाद। मुझे अच्छी भावना थी कि यह संभव नहीं था, लेकिन मुझे समाधान खोजने के लिए धक्का दिया जा रहा था। हमने कुछ भी लागू करने का अंत नहीं किया लेकिन केवल एक सामान्य फ़ाइल अपलोड किया। पीएस मैंने अपना प्रदर्शन नाम उपयोगकर्ता 1404399 की तुलना में कुछ अधिक सुगम में अपडेट किया – CAL5101