Как переименовать файлы и папки в Amazon S3?
есть ли функция переименования файлов и папок в Amazon S3? Любые предложения также приветствуются.
13 ответов
нет прямого метода переименования файла в s3. что вам нужно сделать, это скопировать существующий файл с новым именем (просто набор целевой ключ) и удалить старую.
Я только что протестировал это, и это работает:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
Я только что получил это работает. Вы можете использовать AWS SDK для PHP следующим образом:
use Aws\S3\S3Client;
$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';
$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Key Name ***';
// Instantiate the client.
$s3 = S3Client::factory();
// Copy an object.
$s3->copyObject(array(
'Bucket' => $targetBucket,
'Key' => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
));
http://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectUsingPHP.html
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
для переименования файлов и папок в AWS S3 bucket можно использовать команду AWS CLI или s3cmd.
используя S3cmd, используйте следующий синтаксис для переименования папки,
s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
используя AWS CLI, используйте следующий синтаксис для переименования папки,
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
нет способа переименовать папку через GUI, самый быстрый (и простой, если вам нравится GUI) способ достичь этого-выполнить обычную старую копию. Чтобы достичь этого: создайте новую папку на S3 с помощью GUI, перейдите в свою старую папку, выберите все, отметьте "копировать", а затем перейдите в новую папку и выберите"Вставить". Когда закончите, удалите старую папку.
этот простой метод очень быстрый, потому что он копирует с S3 на себя (не нужно повторно загружать или что-то в этом роде), и он также поддерживает разрешения и метаданные скопированных объектов, как и следовало ожидать.
теперь это возможно для файлов, выберите Файл, затем выберите больше > переименовать в GUI.
чтобы переименовать папку, Вам вместо этого нужно создать новую папку и выбрать содержимое старой и скопировать / вставить ее (в разделе " Еще " снова)
вот как вы это делаете в .NET, используя S3 .NET SDK
:
var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);
П. С. Попробуйте использовать "асинхронный" версий клиентские методы, где это возможно, хотя я не делал так для читабельности
это работает для переименования файла в той же папке
aws s3 mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
файл и папка фактически являются объектами в S3. Вы должны использовать put OBJECT COPY для их переименования. См.http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html
как ответил Naaz, прямое переименование 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;
}
}
S3DirectoryInfo имеет MoveTo метод, который будет перемещать один каталог на другой каталог, такой, что перемещенный каталог станет подкаталогом другого каталога с тем же именем, что и изначально.
метод расширения ниже переместит один каталог в другой каталог, т. е. перемещенный каталог станет другим каталогом. На самом деле он создает новый каталог, перемещает все содержимое старого каталога в него, а затем удалить старую.
public static class S3DirectoryInfoExtensions
{
public static S3DirectoryInfo Move(this S3DirectoryInfo fromDir, S3DirectoryInfo toDir)
{
if (toDir.Exists)
throw new ArgumentException("Destination for Rename operation already exists", "toDir");
toDir.Create();
foreach (var d in fromDir.EnumerateDirectories())
d.MoveTo(toDir);
foreach (var f in fromDir.EnumerateFiles())
f.MoveTo(toDir);
fromDir.Delete();
return toDir;
}
}