2014-04-29 21 views
6

S3 Bucket'de bir dosyayı yeniden adlandırmaya çalışıyorum. İşte bir kod parçacığı YaniAmazon S3 Kovadaki bir dosya nasıl yeniden adlandırılır?

S3Object s3Obj = getS3Client().getObject(new GetObjectRequest(getBucketName(), fileName)); 
//Error in Above Line itself    
    getS3Client().putObject(getBucketName(), newFileName, s3Obj.getObjectContent(), s3Obj.getObjectMetadata()); 

private AmazonS3 getS3Client(){ 
     AWSCredentials myCredentials = new BasicAWSCredentials(AccessKey,SecretKey); 
     AmazonS3 s3client = new AmazonS3Client(myCredentials); 
     return s3client; 
} 

olduğunu, bu hatayı alıyorum,

DEBUG [ana] request.handleErrorResponse (748) | Alınan hata yanıtı: com.amazonaws.services.s3.model.AmazonS3Exception: Durum Kodu: 403, AWS Hizmeti: null, AWS İstek Kimliği: AD2F31F1133A650E, AWS Hata Kodu: AccessDenied.

S3object'in kendisini alamıyorum. Herhangi bir öneri veya fikir S3 Nesnesini nasıl alacağım ve nasıl yeniden adlandıracağım. Yardımlarınız için Beklentilerinizde teşekkürler. S3

+0

olası yinelenen silmek: Bir dosyayı yeniden adlandırmak nasıl bir kovada?] (http://stackoverflow.com/questions/2481685/amazon-s3-boto-how-do-you-rename-a-file-in-a-bucket) –

+0

Teşekkürler. GetS3Client() olarak değiştirdim: copyObject (getBucketName(), oldPhotoName, getBucketName(), "vignesh"); Ama şimdi aynı hatayı alıyorum. Durum Kodu: 403, AWS Hizmeti: Amazon S3, AWS İstek No: 874B8E8905B026CC, AWS Hata Kodu: AccessDenied, AWS Hata Mesajı: Erişim Reddedildi Can Yardım edebilirsiniz. –

cevap

14

Doğrudan adlandırma is not possible

kopyalayabilir ve örneğin kullanarak silebilirsiniz orijinal olanları

kopyalayarak ve silerek nesneleri yeniden adlandırma nesneleri

CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, 
      keyName, bucketName, destinationKeyName); 
s3client.copyObject(copyObjRequest); 
s3client.deleteObject(new DeleteObjectRequest(bucketName, keyName)); 
+0

Yukarıdaki kod sadece dosyaları değil, çocuk klasörlerini kopyalayacaktır. – Mateen

0

s3 High6 doğrudan yeniden adlandırılması tarafından cevap olarak mümkün değildir, ancak onun kod ı

kodudur tüm içeriğini kopyalar bir kod parçası iliştirilmesi

tüm içeriğini kopyalamak olmaz > (kaynak klasör içeriğini kopyalamak iç içe çocuk - sadece aws erişim tuşu ve gizli anahtar

burada

eklemek çalışan i

kodunda yaptığı şey ve klasörler) ve hedef klasörde yapıştırılan

-> kopyalama işlemi tamamlandığında, kaynak klasörü

package com.bighalf.doc.amazon; 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.util.List; 

import com.amazonaws.auth.AWSCredentials; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.services.s3.model.CopyObjectRequest; 
import com.amazonaws.services.s3.model.ObjectMetadata; 
import com.amazonaws.services.s3.model.PutObjectRequest; 
import com.amazonaws.services.s3.model.S3ObjectSummary; 

public class Test { 

public static boolean renameAwsFolder(String bucketName,String keyName,String newName) { 
    boolean result = false; 
    try { 
     AmazonS3 s3client = getAmazonS3ClientObject(); 
     List<S3ObjectSummary> fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries(); 
     //some meta data to create empty folders start 
     ObjectMetadata metadata = new ObjectMetadata(); 
     metadata.setContentLength(0); 
     InputStream emptyContent = new ByteArrayInputStream(new byte[0]); 
     //some meta data to create empty folders end 

     //final location is the locaiton where the child folder contents of the existing folder should go 
     String finalLocation = keyName.substring(0,keyName.lastIndexOf('/')+1)+newName; 
     for (S3ObjectSummary file : fileList) { 
      String key = file.getKey(); 
      //updating child folder location with the newlocation 
      String destinationKeyName = key.replace(keyName,finalLocation); 
      if(key.charAt(key.length()-1)=='/'){ 
       //if name ends with suffix (/) means its a folders 
       PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, destinationKeyName, emptyContent, metadata); 
       s3client.putObject(putObjectRequest); 
      }else{ 
       //if name doesnot ends with suffix (/) means its a file 
       CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, 
         file.getKey(), bucketName, destinationKeyName); 
       s3client.copyObject(copyObjRequest); 
      } 
     } 
     boolean isFodlerDeleted = deleteFolderFromAws(bucketName, keyName); 
     return isFodlerDeleted; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

public static boolean deleteFolderFromAws(String bucketName, String keyName) { 
    boolean result = false; 
    try { 
     AmazonS3 s3client = getAmazonS3ClientObject(); 
     //deleting folder children 
     List<S3ObjectSummary> fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries(); 
     for (S3ObjectSummary file : fileList) { 
      s3client.deleteObject(bucketName, file.getKey()); 
     } 
     //deleting actual passed folder 
     s3client.deleteObject(bucketName, keyName); 
     result = true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

public static void main(String[] args) { 
    intializeAmazonObjects(); 
    boolean result = renameAwsFolder(bucketName, keyName, newName); 
    System.out.println(result); 
} 

private static AWSCredentials credentials = null; 
private static AmazonS3 amazonS3Client = null; 
private static final String ACCESS_KEY = ""; 
private static final String SECRET_ACCESS_KEY = ""; 
private static final String bucketName = ""; 
private static final String keyName = ""; 
//renaming folder c to x from key name 
private static final String newName = ""; 

public static void intializeAmazonObjects() { 
    credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY); 
    amazonS3Client = new AmazonS3Client(credentials); 
} 

public static AmazonS3 getAmazonS3ClientObject() { 
    return amazonS3Client; 
} 

} [Amazon S3 Boto ait