2012-12-14 30 views
5

का उपयोग कर फ़ाइल अपलोड प्रगति पट्टी अपलोड करें मेरे पास एक जावा डेस्कटॉप क्लाइंट एप्लिकेशन है जो एक आरईएसटी सेवा में फ़ाइलों को अपलोड करता है।RestTemplate.postForLocation

आरईएसटी सेवा के सभी कॉल स्प्रिंग रेस्ट टेम्पलेट क्लास का उपयोग करके संभाले जाते हैं।

मैं एक प्रगति पट्टी को लागू करने और कार्यक्षमता को रद्द करने के लिए देख रहा हूं क्योंकि अपलोड होने वाली फाइलें काफी बड़ी हो सकती हैं।

मैं इसे वेब पर लागू करने का एक तरीका ढूंढ रहा हूं लेकिन कोई भाग्य नहीं है।

मैंने अपने स्वयं के संसाधन HttpMessageConverter को कार्यान्वित करने और लिखने के लिए आंतरिक() विधि को प्रतिस्थापित करने का प्रयास किया लेकिन वास्तव में अनुरोध पोस्ट करने से पहले इस विधि को कुछ प्रकार के buffered ऑपरेशन के दौरान बुलाया जाता है (इसलिए धारा को भेजने से पहले एक ही बार में पढ़ा जाता है)।

मैंने CommonsClientHttpRequestFactory.createRequest() विधि को ओवरराइड करने का प्रयास किया है और एक विशेष writeRequest() विधि के साथ अपनी खुद की RequestEntity क्लास को कार्यान्वित करने का प्रयास किया है, लेकिन एक ही समस्या होती है (स्ट्रीम वास्तव में पोस्ट भेजने से पहले पढ़ी जाती है)।

क्या मैं गलत जगह देख रहा हूं? क्या किसी ने कुछ ऐसा किया है।

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

किसी भी मदद या सुझावों की बहुत सराहना की।

+0

इस हो सकता है आप http://stackoverflow.com/questions के लिए क्या देख रहे/52 9 4532/httpclient-upload-big-file-and-show-sent-bytes-number – ams

+1

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

उत्तर

0

इस ऐप के बारे में बहुत कुछ नहीं था, या यह कैसे काम करता है, इसलिए यह प्रतिक्रिया अस्पष्ट है लेकिन मेरा मानना ​​है कि आप अपनी अपलोड प्रगति को ट्रैक करने के लिए ऐसा कुछ कर सकते हैं।

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

जब आपको फ़ाइल का आकार मिलता है।

Integer totalFile = file.getTotalSpace(); 

कहाँ कभी आप एक धारा आप शायद किसी तरह के उत्पादन बफर बाइट्स जोड़ रहे हैं के रूप में संचारण रहे

byte[] bytesFromSomeFileReader = [whatEverYouAreUsingToReadTheFile]; 

    ByteArrayOutputStream byteStreamToServer = new ByteArrayOutputStream(); 
    Integer bytesTransmitted = 0; 

    for (byte fileByte : bytesFromSomeFileReader) { 
     byteStreamToServer.write(fileByte); 
      // 
      // Update your progress bar every killo-byte sent. 
      // 
     bytesTransmitted++; 
     if((bytesTransmitted % 1000) = 0) { 
      someMethodToUpdateProgressBar(); 
     } 
    } 
+0

क्षमा करें, लेकिन यह मदद नहीं करता है। सिद्धांत रूप में यह समाधान ध्वनि है, लेकिन जैसा कि मैंने ओपी में कहा है कि अपलोड शुरू होने से पहले स्ट्रीम पूरी तरह से पढ़ी जा रही है। तो प्रगति पट्टी 100% तक होगी और फिर अपलोड के लिए लंबे समय तक वहां बैठेगी। – glidester

+0

??? अपलोड से पहले यह कैसे पढ़ा जाता है? यह संभव नहीं है। जैसा कि कहा गया है कि क्या किया जा रहा है या कैसे किया गया कोई विवरण नहीं दिया गया था। आपको वास्तविक विवरण देना होगा और अधिक विस्तृत उत्तर प्रदान करना होगा। – BrianC

+0

अगर हम क्लाइंट के बारे में बात कर रहे हैं तो स्ट्रीम कैसे पढ़ा जाता है? यह ग्राहक से लिखा जाना चाहिए। – BrianC

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

  • कोई संबंधित समस्या नहीं^_^