2014-04-29 7 views
6

Próbuję zmienić nazwę pliku w S3 Bucket. Oto fragment koduJak zmienić nazwę pliku w Wiadro Amazon S3?

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; 
} 

Więc ja dostaję ten błąd,

DEBUG [głównym] request.handleErrorResponse (748) | Otrzymano odpowiedź błędu: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: null, AWS Request ID: AD2F31F1133A650E, AWS Error Code: AccessDenied.

Nie mogę uzyskać samego obiektu s3. Wszelkie sugestie i pomysły, w jaki sposób otrzymam obiekt S3 i zmieni jego nazwę. Dziękuję w oczekiwaniu na pomoc.

+0

możliwy duplikat [Amazon S3 boto: Jak zmienić nazwę pliku w wiadrze?] (http://stackoverflow.com/questions/2481685/amazon-s3-boto-how-do-you-rename-a-file-in-a-bucket) –

+0

Dzięki. Zmieniłem na 'getS3Client(). CopyObject (getBucketName(), oldPhotoName, getBucketName()," vignesh ");' Ale teraz również otrzymuję ten sam błąd. 'Status Code: 403, AWS Service: Amazon S3, AWS Request Request: 874B8E8905B026CC, AWS Kod błędu: AccessDenied, AWS Komunikat o błędzie: Access Denied' Czy możesz pomóc. –

Odpowiedz

14

Bezpośrednia zmiana nazwy S3 obiektów is not possible

Zmiana nazwy obiektów poprzez ich kopiowanie i usuwanie oryginalne

Można kopiować i usuwać za pomocą np

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

Powyższy kod skopiuje tylko pliki, ale nie foldery podrzędne. – Mateen

0

Jak odpowiedział High6 bezpośredniej zmiany nazwy s3 nie jest możliwe, ale jego kod nie będzie skopiować całą zawartość

Mam załączeniu fragment kodu, który spowoduje skopiowanie całej zawartości

kod jest pracę po prostu dodaj swój klucz dostępu AWS i tajny klucz

oto co zrobiłem w kodzie

-> skopiuj zawartość folderu źródłowego (zagnieżdżona dziecko i foldery) i wklejony w folderze docelowym

-> po zakończeniu kopiowania, usuń folder źródłowy

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; 
} 

}