简体   繁体   English

如何在Amazon S3 Bucket中重命名文件?

[英]How to rename a file in Amazon S3 Bucket?

I am trying to rename a file in S3 Bucket. 我想在S3 Bucket中重命名一个文件。 Here is a code snippet 这是一段代码片段

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

So, I am getting this error, 所以,我收到这个错误,

DEBUG [main] request.handleErrorResponse(748) | DEBUG [main] request.handleErrorResponse(748)| Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: null, AWS Request ID: AD2F31F1133A650E, AWS Error Code: AccessDenied. 收到错误响应:com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:403,AWS服务:null,AWS请求ID:AD2F31F1133A650E,AWS错误代码:AccessDenied。

I am unable to get the s3object itself. 我无法获得s3object本身。 Any suggestions or ideas how I will get S3 Object and rename it. 任何建议或想法我将如何获得S3对象并重命名它。 Thanks in Anticipation for you help. 在预期中感谢您的帮助。

Direct renaming of S3 objects is not possible 无法直接重命名S3对象

Rename objects by copying them and deleting the original ones 通过复制对象并删除原始对象来重命名对象

You can copy and delete using eg 您可以使用例如复制和删除

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

As answered by High6 direct renaming of s3 is not possible, but his code will not copy all the contents 正如High6所说,直接重命名s3是不可能的,但他的代码不会复制所有内容

i have attached a code snippet which will copy all the contents 我附上了一个代码片段,它将复制所有内容

code is working just add your aws access key and secret key 代码工作只是添加您的aws访问密钥和密钥

here's what i did in code 这是我在代码中所做的

-> copy the source folder contents(nested child and folders) and pasted in the destination folder - >复制源文件夹内容(嵌套的子文件夹和文件夹)并粘贴到目标文件夹中

-> when the copying is complete, delete the source folder - >复制完成后,删除源文件夹

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

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM