मैं जावा का उपयोग करके S3 में एक फ़ाइल अपलोड कर रहा हूं - यह वही है जो मुझे अब तक मिला है:
AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials("XX","YY"));
List<Bucket> buckets = s3.listBuckets();
s3.putObject(new PutObjectRequest(buckets.get(0).getName(), fileName, stream, new ObjectMetadata()));
फ़ाइल अपलोड की जा रही है, लेकिन जब सामग्री की लंबाई निर्धारित नहीं की जा रही हो, तो एक चेतावनी दी जाती है:
com.amazonaws.services.s3.AmazonS3Client putObject: No content length specified for stream > data. Stream contents will be buffered in memory and could result in out of memory errors.
यह एक फ़ाइल है जिसे मैं अपलोड कर रहा हूं और streamचर एक है InputStream, जिससे मैं बाइट सरणी को इस तरह प्राप्त कर सकता हूं IOUtils.toByteArray(stream):।
इसलिए जब मैं इस तरह से सामग्री की लंबाई और MD5 ( यहाँ से लिया गया ) सेट करने का प्रयास करता हूँ :
// get MD5 base64 hash
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(IOUtils.toByteArray(stream));
byte[] resultByte = messageDigest.digest();
String hashtext = new String(Hex.encodeHex(resultByte));
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(IOUtils.toByteArray(stream).length);
meta.setContentMD5(hashtext);
यह S3 से वापस आने के लिए निम्न त्रुटि का कारण बनता है:
आपके द्वारा निर्दिष्ट सामग्री-एमडी 5 अमान्य था।
मैं क्या गलत कर रहा हूं?
किसी भी मदद की सराहना की!
PS मैं Google App Engine पर हूं - मैं फ़ाइल को डिस्क पर लिखने या एक अस्थायी फ़ाइल बनाने के लिए नहीं लिख सकता क्योंकि AppEngine FileOutputStream का समर्थन नहीं करता है।