2014-04-29 18 views
6

Tôi đang cố đổi tên tệp trong Thùng S3. Dưới đây là một đoạn mãLàm thế nào để đổi tên một tập tin trong 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; 
} 

Vì vậy, tôi nhận được lỗi này,

DEBUG [chính] request.handleErrorResponse (748) | Đã nhận được phản hồi lỗi: com.amazonaws.services.s3.model.AmazonS3Exception: Mã trạng thái: 403, Dịch vụ AWS: null, ID yêu cầu AWS: AD2F31F1133A650E, Mã lỗi AWS: AccessDenied.

Tôi không thể lấy chính s3object. Bất kỳ đề xuất hoặc ý tưởng làm thế nào tôi sẽ nhận được S3 Object và đổi tên nó. Cảm ơn bạn đã tham gia sự giúp đỡ.

đổi tên
+0

thể trùng lặp của [Amazon S3 boto: Làm thế nào để bạn đổi tên một tập tin trong một thùng?] (http://stackoverflow.com/questions/2481685/amazon-s3-boto-how-do-you-rename-a-file-in-a-bucket) –

+0

Cảm ơn. Tôi đã thay đổi thành 'getS3Client(). CopyObject (getBucketName(), oldPhotoName, getBucketName()," vignesh ");' Nhưng bây giờ tôi cũng gặp lỗi tương tự. 'Mã trạng thái: 403, Dịch vụ AWS: Amazon S3, ID yêu cầu AWS: 874B8E8905B026CC, Mã lỗi AWS: AccessDenied, Thông báo lỗi AWS: Truy cập bị từ chối' Bạn có thể vui lòng trợ giúp không. –

Trả lời

14

trực tiếp của S3 đối tượng is not possible

Đổi tên đối tượng bằng cách sao chép chúng và xoá những bản gốc

Bạn có thể sao chép và xóa bằng ví dụ

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

mã ở trên sẽ chỉ sao chép các tệp nhưng không sao chép các thư mục con. – Mateen

0

Như đã trả lời bởi High6 đổi tên trực tiếp của s3 là không thể, nhưng mã của mình sẽ không sao chép tất cả các nội dung

tôi có kèm theo một đoạn mã mà sẽ sao chép tất cả các nội dung

code đang chỉ cần thêm khóa truy cập và khóa bí mật của bạn

đây là những gì tôi đã làm trong mã

-> sao chép nội dung thư mục nguồn và thư mục) và dán vào thư mục đích

-> khi sao chép hoàn tất, xóa các thư mục nguồn

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

}

Các vấn đề liên quan