2014-04-29 5 views
6

J'essaie de renommer un fichier dans S3 Bucket. Voici un extrait de codeComment renommer un fichier dans Amazon S3 Bucket?

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

Donc, je reçois cette erreur,

DEBUG [principal] request.handleErrorResponse (748) | Réponse d'erreur reçue: com.amazonaws.services.s3.model.AmazonS3Exception: code d'état: 403, service AWS: nul, ID de requête AWS: AD2F31F1133A650E, code d'erreur AWS: AccessDenied.

Je n'arrive pas à obtenir l'objet s3object lui-même. Toutes les suggestions ou idées comment je vais obtenir l'objet S3 et le renommer. Merci d'avance pour votre aide.

+0

en double possible de [Amazon S3 Boto: Comment renommer un fichier dans un seau?] (http://stackoverflow.com/questions/2481685/amazon-s3-boto-how-do-you-rename-a-file-in-a-bucket) –

+0

Merci. J'ai changé à 'getS3Client(). CopyObject (getBucketName(), oldPhotoName, getBucketName()," vignesh ");' Mais maintenant, je reçois la même erreur. 'Code d'état: 403, Service AWS: Amazon S3, AWS ID de la demande: 874B8E8905B026CC, code d'erreur AWS: AccessDenied, AWS Message d'erreur: Accès refusé 'Pouvez-vous s'il vous plaît aider. –

Répondre

14

renommage direct des objets S3 is not possible

Renommer des objets en les copiant et en supprimant celles d'origine

Vous pouvez copier et supprimer à l'aide par exemple

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

le code ci-dessus copie uniquement les fichiers mais pas les dossiers enfants. – Mateen

0

Comme répondu par High6 renommage direct de s3 n'est pas possible, mais son code ne sera pas copier tout le contenu

Je joins un extrait de code qui permet de copier tout le contenu

Code

est ajoutez votre travail justes aws clé d'accès et clé secrète

est ici ce que je l'ai fait dans le code

-> copier le contenu du dossier source (enfant imbriqué et les dossiers) et collés dans le dossier de destination

-> lorsque la copie est terminée, supprimez le dossier source

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

}

Questions connexes