2014-04-29 23 views
6

मैं एस 3 बाल्टी में एक फ़ाइल का नाम बदलने की कोशिश कर रहा हूं। कोड स्निपेटअमेज़ॅन एस 3 बाल्टी में फ़ाइल का नाम कैसे बदलें?

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

तो है, मैं इस त्रुटि हो रही है,

डीबग [मुख्य] ​​request.handleErrorResponse (748) | त्रुटि प्रतिक्रिया प्राप्त हुई: com.amazonaws.services.s3.model.AmazonS3 अपवाद: स्थिति कोड: 403, एडब्ल्यूएस सेवा: शून्य, एडब्ल्यूएस अनुरोध आईडी: AD2F31F1133A650E, एडब्ल्यूएस त्रुटि कोड: AccessDenied।

मैं स्वयं s3object प्राप्त करने में असमर्थ हूं। कोई सुझाव या विचार मैं एस 3 ऑब्जेक्ट कैसे प्राप्त करूंगा और इसका नाम बदलूंगा। आपकी मदद के लिए प्रत्याशा में धन्यवाद।

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, एडब्लूएस सेवा: अमेज़ॅन एस 3, एडब्लूएस अनुरोध आईडी: 874 बी 8 ई 8905 बी026 सीसी, एडब्ल्यूएस त्रुटि कोड: एक्सेसडेन, एडब्ल्यूएस त्रुटि संदेश: एक्सेस अस्वीकृत 'क्या आप कृपया मदद कर सकते हैं। –

उत्तर

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 प्रत्यक्ष नाम से जवाब के रूप में संभव नहीं है, लेकिन अपने कोड सभी सामग्री को

मैं एक कोड का टुकड़ा है जो सभी सामग्री को

कोड है कॉपी करेंगे संलग्न कॉपी नहीं करेंगे > कॉपी स्रोत फ़ोल्डर सामग्री (नेस्टेड बच्चे - बस अपने एडब्ल्यूएस एक्सेस कुंजी और गुप्त कुंजी

यहाँ

जोड़ने वर्किंग क्या मैं

कोड में किया था है और फ़ोल्डरों) और गंतव्य फ़ोल्डर में चिपकाया

-> जब नकल पूरा हो गया है, स्रोत फ़ोल्डर

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

}

संबंधित मुद्दे