Java 如何重命名 Amazon S3 存储桶中的文件?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23368176/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 22:17:30  来源:igfitidea点击:

How to rename a file in Amazon S3 Bucket?

javaamazon-web-servicesamazon-s3amazon

提问by Vignesh Gopalakrishnan

I am trying to rename a file in S3 Bucket. Here is a code snippet

我正在尝试重命名 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;
}

So, I am getting this error,

所以,我收到这个错误,

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.

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

I am unable to get the s3object itself. Any suggestions or ideas how I will get S3 Object and rename it. Thanks in Anticipation for you help.

我无法获得 s3object 本身。我将如何获取 S3 对象并重命名它的任何建议或想法。感谢您的帮助。

回答by H6.

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 e.g.

您可以使用例如复制和删除

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

回答by Mateen

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

}

}