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

Java 如何在Amazon S3 Bucket中重命名文件?,java,amazon-web-services,amazon-s3,amazon,Java,Amazon Web Services,Amazon S3,Amazon,我正在尝试重命名S3 Bucket中的一个文件。下面是一段代码片段 S3Object s3Obj = getS3Client().getObject(new GetObjectRequest(getBucketName(), fileName)); //Error in Above Line itself getS3Client().putObject(getBucketName(), newFileName, s3Obj.getObjectCont

我正在尝试重命名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;
}
所以,我得到了这个错误

调试[main]请求。handleErrorResponse(748)|收到的错误响应:com.amazonaws.services.s3.model.amazons3异常:状态代码:403,AWS服务:null,AWS请求ID:AD2F3113A650E,AWS错误代码:AccessDenied

我无法获取对象本身。任何关于如何获取S3对象并将其重命名的建议或想法。
非常感谢您的帮助。

直接重命名S3对象

通过复制对象并删除原始对象来重命名对象

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

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

正如High6所回答的,s3的直接重命名是不可能的,但他的代码不会复制所有内容

我附加了一个代码片段,它将复制所有的内容

代码正在运行,只需添加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;
}
package com.bighhalf.doc.amazon;
导入java.io.ByteArrayInputStream;
导入java.io.InputStream;
导入java.util.List;
导入com.amazonaws.auth.AWSCredentials;
导入com.amazonaws.auth.BasicAWSCredentials;
导入com.amazonaws.services.s3.AmazonS3;
导入com.amazonaws.services.s3.amazon3Client;
导入com.amazonaws.services.s3.model.CopyObjectRequest;
导入com.amazonaws.services.s3.model.ObjectMetadata;
导入com.amazonaws.services.s3.model.PutObjectRequest;
导入com.amazonaws.services.s3.model.S3ObjectSummary;
公开课考试{
公共静态布尔重命名文件夹(字符串bucketName、字符串keyName、字符串newName){
布尔结果=假;
试一试{
AmazonS3 s3client=getAmazonS3ClientObject();
List fileList=s3client.listObjects(bucketName,keyName).getObjectSummaries();
//开始创建空文件夹的某些元数据
ObjectMetadata=新的ObjectMetadata();
metadata.setContentLength(0);
InputStream emptyContent=new ByteArrayInputStream(新字节[0]);
//用于创建空文件夹的某些元数据结束
//最终位置是现有文件夹的子文件夹内容应放在的位置
字符串finalLocation=keyName.substring(0,keyName.lastIndexOf('/')+1)+newName;
用于(S3ObjectSummary文件:文件列表){
String key=file.getKey();
//使用新位置更新子文件夹位置
字符串destinationKeyName=key.replace(keyName,finalLocation);
if(key.charAt(key.length()-1)=='/')){
//如果名称以后缀(/)结尾,则表示其为a文件夹
PutObjectRequest PutObjectRequest=新的PutObjectRequest(bucketName、destinationKeyName、emptyContent、元数据);
s3client.putObject(putObjectRequest);
}否则{
//如果名称未以后缀(/)结尾,则表示它是一个文件
CopyObjectRequest CopyObjectRequest=新的CopyObjectRequest(bucketName,
file.getKey(),bucketName,destinationKeyName);
s3client.copyObject(copyObjRequest);
}
}
布尔值isFodlerDeleted=deleteFolderFromAws(bucketName,keyName);
返回已删除;
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
公共静态布尔deleteFolderFromAws(字符串bucketName、字符串keyName){
布尔结果=假;
试一试{
AmazonS3 s3client=getAmazonS3ClientObject();
//删除文件夹子项
List fileList=s3client.listObjects(bucketName,keyName).getObjectSummaries();
用于(S3ObjectSummary文件:文件列表){
s3client.deleteObject(bucketName,file.getKey());
}
//删除实际传递的文件夹
s3client.deleteObject(bucketName、keyName);
结果=真;
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
公共静态void main(字符串[]args){
初始化对象();
布尔结果=重命名文件夹(bucketName、keyName、newName);
系统输出打印项次(结果);
}
私有静态AWSCredentials凭证=null;
私有静态AmazonS3 amazonS3Client=null;
私有静态最终字符串访问_KEY=“”;
私有静态最终字符串SECRET_ACCESS_KEY=“”;
私有静态最终字符串bucketName=“”;
私有静态最终字符串keyName=“”;
//将文件夹c从密钥名重命名为x
私有静态最终字符串newName=“”;
publicstaticvoid initializemazonobjects(){
凭证=新的基本凭证(访问密钥、机密访问密钥);
amazonS3Client=新的amazonS3Client(凭证);
}
公共静态AmazonS3 getAmazonS3ClientObject(){
返回amazonS3Client;
}

}

谢谢。我改为
getS3Client().copyObject(getBucketName(),oldPhotoName,getBucketName(),“vignesh”)但现在我也得到了同样的错误<代码>状态代码:403,AWS服务:Amazon S3,AWS请求ID:874B8E8905B026CC,AWS错误代码:AccessDenied,AWS错误消息:AccessDenied
您能帮忙吗?这是否回答了您的问题?上述代码将只复制文件,而不复制子文件夹。