2016-03-24 6 views
7

मैं अमेज़ॅन एस 3 बाल्टी में फ़ाइलों को अपलोड कर रहा हूं। फाइलें अपलोड की जा रही हैं लेकिन मुझे निम्नलिखित चेतावनी मिलती है।इनपुटस्ट्रीम सामग्री को सेट करने के लिए कैसे करें लंबाई

चेतावनी: स्ट्रीम डेटा के लिए निर्दिष्ट कोई सामग्री लंबाई नहीं। स्ट्रीम सामग्री स्मृति में buffered किया जाएगा और परिणामस्वरूप स्मृति त्रुटियों से बाहर हो सकता है।

तो मैं अपने कोड

metaData.setContentLength(IOUtils.toByteArray(input).length); 

में निम्नलिखित पंक्ति जोड़ा है, लेकिन उसके बाद मैं निम्नलिखित संदेश मिला। मुझे यह भी नहीं पता कि यह एक चेतावनी है या क्या।

डेटा पढ़ने की अपेक्षा से अलग लंबाई है: डेटा लम्बाई = 0; अपेक्षित लंबाई = 1119 9 2; includeSkipped = झूठी; in.getClass() = वर्ग sun.net.httpserver.FixedLengthInputStream; markedSupported = झूठी; चिह्नित = 0; resetSinceLastMarked = झूठी; markCount = 0; resetCount = 0

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

उत्तर

11

जब आप IOUtils.toByteArray के साथ डेटा पढ़ते हैं, तो यह इनपुटस्ट्रीम का उपभोग करता है। जब एडब्ल्यूएस एपीआई इसे पढ़ने की कोशिश करता है, तो यह शून्य लंबाई है।

एक बाइट सरणी में सामग्री पढ़ें और एक InputStream एपीआई है कि सरणी लपेटकर प्रदान करते हैं:

byte[] bytes = IOUtils.toByteArray(input); 
metaData.setContentLength(bytes.length); 
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); 
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, byteArrayInputStream, metadata); 
client.putObject(putObjectRequest); 
+1

ध्यान दें कि यदि आप ऊपर दृष्टिकोण S3 के लिए बड़ी फ़ाइलों को अपलोड कर रहे हैं पहले एक बाइट सरणी में डेटा लोड। यह स्मृति अपवाद से बाहर हो सकता है। – maxTrialfire

+0

@maxTrialfire उस स्थिति में, जब आप बड़ी फ़ाइल अपलोड कर रहे हों तो आप ओओएम को कैसे रोकेंगे? – user482594

+2

@ user482594 उस स्थिति में आपको एक चंकित (मल्टीपार्ट) अपलोड करने की आवश्यकता है। – maxTrialfire

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

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