13 ответов:
нет прямого способа переименовать файл в s3. что вам нужно сделать, это скопировать существующий файл с новым именем (просто набор целевой ключ) и удалить старую.
Я только что проверил это, и это работает:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
можно использовать команды AWS CLI до
mvфайлы
Я только что получил это работает. Вы можете использовать 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 можно использовать команду 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>
нет способа переименовать папку через графический интерфейс, самый быстрый (и простой, если вам нравится графический интерфейс) способ добиться этого-выполнить обычную старую копию. Для этого: создайте новую папку на S3 с помощью графического интерфейса, перейдите в свою старую папку, выберите все, отметьте "копировать", а затем перейдите в новую папку и выберите "Вставить". После этого удалите старую папку.
этот простой метод очень быстрый, потому что он копирует из 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; } }
Comments