2011-08-01 28 views
28

Aşağıdaki kod sadece S3'deki bir kovadan metin dosyalarını indirmek için çalışır. Bu bir görüntü için çalışmaz. AWS SDK'yı kullanarak indirmeleri/türleri yönetmenin daha kolay bir yolu var mı? Dokümantasyonda yer alan örnek, onu belirginleştirmemektedir. Teşekkürler!AWS S3 Java SDK - Dosya indir help

AWSCredentials myCredentials = new BasicAWSCredentials(
     String.valueOf(Constants.act), String.valueOf(Constants.sk)); 
AmazonS3Client s3Client = new AmazonS3Client(myCredentials);   
S3Object object = s3Client.getObject(new GetObjectRequest("bucket", "file")); 

BufferedReader reader = new BufferedReader(new InputStreamReader(
     object.getObjectContent())); 
File file = new File("localFilename");  
Writer writer = new OutputStreamWriter(new FileOutputStream(file)); 

while (true) {   
    String line = reader.readLine();   
    if (line == null) 
      break;    

    writer.write(line + "\n"); 
} 

writer.close(); 
+0

i şey yapmak ve kodunuzu deneyin ama use.Currently i aws-android-sdk-2.1.5-s3.jar kavanoz kullanıyorum ancak tüm bulunamadı hangi kavanoz önermek misiniz bulunamadı Jar zorunda th sınıfları. – Ravi

+0

Dosya yüklemek için herhangi bir fikrim var amazon.Idosya indirmek için kodunuzu kullanıyorum ve mükemmel çalışıyor. – Ravi

cevap

31

Reader ve InputStream kullanarak olmalıdır Yazar sınıfları ve OutputStream sınıfların Koşma:

InputStream reader = new BufferedInputStream(
    object.getObjectContent()); 
File file = new File("localFilename");  
OutputStream writer = new BufferedOutputStream(new FileOutputStream(file)); 

int read = -1; 

while ((read = reader.read()) != -1) { 
    writer.write(read); 
} 

writer.flush(); 
writer.close(); 
reader.close(); 
+1

Bunu bir noktada denedim, ama açıkça başarısız oldu :) Teşekkürler, bu inanılmaz çalışıyor! –

43

Mauricio yanıtında yazılı kod çalışsa da - Amazon - ve akışları hakkında yaptığı nokta elbette doğrudur dosyaları SDK'larında kaydetmek için daha hızlı bir yol sunar. 2011'de müsait olup olmadığını bilmiyorum, ama şimdi.

AmazonS3Client s3Client = new AmazonS3Client(myCredentials); 

File localFile = new File("localFilename"); 

ObjectMetadata object = s3Client.getObject(new GetObjectRequest("bucket", "s3FileName"), localFile); 
+4

Küçük bir düzenlemeye gerek duyar: Nesne içeriği dosyaya kaydedilir, ancak döndürülen nesne 'S3Object' değil' ObjectMetadata'dır. Http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObject%28com.amazonaws.services.s3.model.GetObjectRequest%%20java.io.File% adresine bakın. 29 – azdev

+1

@azdev Aslında, kod örneği [getObject'ün farklı bir sürümünü kullanır] (http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObject (java. lang.String,% 20java.lang.String)) bir S3Object döndürür. – Eyal

+0

Kodumdaki S3Client.getObject yöntemini nasıl göremiyorum? .. Aynı sonuca ulaşmak istiyorum ama s3Client nesnemle ilişkili bir yöntem yok. Bir şey mi eksik? –

12

Eyals cevabı, sizi yarı yolda götürür ama hepsi açık değildir, böylece açıklığa kavuşacağım.

AmazonS3Client s3Client = new AmazonS3Client(myCredentials); 

//This is where the downloaded file will be saved 
File localFile = new File("localFilename"); 

//This returns an ObjectMetadata file but you don't have to use this if you don't want 
s3Client.getObject(new GetObjectRequest(bucketName, id.getId()), localFile); 

//Now your file will have your image saved 
boolean success = localFile.exists() && localFile.canRead(); 
+0

id.getId() için ne kullandınız? –

+0

id.getId(), nesneyi kepçe içinde depolamak için kullandığınız anahtardır. Anahtarımı sadece kimliğini bildiğim kadar kullanıyorum. Özetlemek gerekirse, boş bir dosya oluşturursunuz, yeni boş dosyanın olduğu aws api'yi ve aws api'nin nesneyi belirttiğiniz dosyaya yazmasını sağlayan bir getRequest yapın. Çok uygun. –

+0

@ShawnVader: Lütfen dosyayı neden doğruladığınızı anlayabilirsiniz. Ben S3 API bir karma kontrol yapar. Teşekkür ederim. – saurabheights