2014-04-29 102 views
6

我正在嘗試重命名S3 Bucket中的文件。下面的代碼片段如何重命名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; 
} 

所以,我收到此錯誤,

DEBUG [主] request.handleErrorResponse(748)|收到錯誤響應:com.amazonaws.services.s3.model.AmazonS3Exception:狀態碼:403,AWS服務:null,AWS請求ID:AD2F31F1133A650E,AWS錯誤代碼:AccessDenied。

我無法獲得s3object本身。任何建議或想法我將如何獲得S3 Object並重命名它。 非常感謝您的幫助。

S3的
+0

[亞馬遜S3的Boto可能重複:您如何重命名文件在一個桶?](http://stackoverflow.com/questions/2481685/amazon-s3-boto-how-do-you-rename-a-file-in-a-bucket) –

+0

謝謝。我更改爲'getS3Client()。copyObject(getBucketName(),oldPhotoName,getBucketName(),「vignesh」);'但現在我也得到同樣的錯誤。 '狀態碼:403,AWS服務:Amazon S3,AWS請求ID:874B8E8905B026CC,AWS錯誤代碼:AccessDenied,AWS錯誤消息:訪問被拒絕您能否請幫助。 –

回答

14

直接重命名對象is not possible

通過複製它們,刪除原有的

重命名對象

您可以複製並使用例如刪除

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

上面的代碼將只複製文件而不復制子文件夾。 – Mateen

0

如回答了S3的High6直接改名是不可能的,但他的代碼不會複製所有

我附上一段代碼,這將複製所有內容

代碼內容工作只需添加您的AWS訪問密鑰和祕密密鑰

這裏就是我所做的代碼

- >複製源文件夾中的內容(嵌套子和文件夾),並在目標文件夾中粘貼

- >複製完成後,刪除源文件夾

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

}