Коли я намагаюся завантажити папку з підпапками в S3 через консоль AWS, завантажуються лише файли, а не підпапки.
Ви також не можете вибрати папку. Завжди потрібно спочатку відкрити папку, перш ніж ви зможете щось вибрати.
Чи можливо це взагалі?
Відповіді:
Вам не потрібен Enhanced Uploader (який, на мою думку, вже не існує) або будь-яке стороннє програмне забезпечення (яке завжди має ризик того, що хтось викраде ваші приватні дані або ключі доступу з сегмента S3 або навіть з усіх ресурсів AWS).
Оскільки новий менеджер веб-завантаження AWS S3 підтримує перетягування файлів і папок , просто увійдіть на https://console.aws.amazon.com/s3/home і починайте процес завантаження, як зазвичай, а потім просто перетягніть папку з вашого робочий стіл безпосередньо на сторінку S3.
Я пропоную вам використовувати AWS CLI. Оскільки за допомогою командного рядка та awscli дуже просто
aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
або ви можете використовувати синхронізацію до
aws s3 sync SOURCE_DIR s3://DEST_BUCKET/
Пам'ятайте, що вам потрібно встановити aws cli і налаштувати його за допомогою ідентифікатора ключа доступу та секретного ідентифікатора ключа доступу
pip install --upgrade --user awscli
aws configure
aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
не призведе до створення s3://DEST_BUCKET/SOURCE_DIR
, але автоматичне створення цієї віддаленої папки передбачається у більшості випадків.
s3://DEST_BUCKET/SOURCE_DIR
як частину команди aws s3 cp. Я просто зробив вручну папку на відрі s3 з тим самим іменем і рекурсивно скопіював туди.
Консоль Amazon S3 тепер підтримує завантаження цілих ієрархій папок. Увімкніть розширений завантажувач у діалоговому вікні Завантаження, а потім додайте одну або кілька папок у чергу завантаження.
Зазвичай я використовую Enhanced Uploader, доступний через консоль керування AWS. Однак, оскільки для цього потрібна Java, це може спричинити проблеми. Я знайшов s3cmd як чудову заміну командного рядка. Ось як я ним користувався:
s3cmd --configure # enter access keys, enable HTTPS, etc.
s3cmd sync <path-to-folder> s3://<path-to-s3-bucket>/
У мене були проблеми з пошуком розширеного інструмента завантаження для завантаження папки та підпапок всередині неї в S3. Але замість того, щоб знайти інструмент, я міг завантажувати папки разом із підпапками всередині нього, просто перетягуючи та скидаючи їх у відро S3.
Примітка. Ця функція перетягування не працює в Safari . Я протестував його в Chrome, і він чудово працює.
Після перетягування файлів і папок, нарешті, відкриється цей екран для завантаження вмісту.
Рішення 1:
var AWS = require('aws-sdk');
var path = require("path");
var fs = require('fs');
const uploadDir = function(s3Path, bucketName) {
let s3 = new AWS.S3({
accessKeyId: process.env.S3_ACCESS_KEY,
secretAccessKey: process.env.S3_SECRET_KEY
});
function walkSync(currentDirPath, callback) {
fs.readdirSync(currentDirPath).forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
walkSync(filePath, callback);
}
});
}
walkSync(s3Path, function(filePath, stat) {
let bucketPath = filePath.substring(s3Path.length+1);
let params = {Bucket: bucketName, Key: bucketPath, Body: fs.readFileSync(filePath) };
s3.putObject(params, function(err, data) {
if (err) {
console.log(err)
} else {
console.log('Successfully uploaded '+ bucketPath +' to ' + bucketName);
}
});
});
};
uploadDir("path to your folder", "your bucket name");
Рішення 2:
aws s3 cp SOURCE_DIR s3://DEST_BUCKET/ --recursive
Варто згадати, що якщо ви просто використовуєте S3 для резервного копіювання, вам просто потрібно заархівувати папку, а потім завантажити її. Це заощадить ваш час та витрати на завантаження.
Якщо ви не впевнені, як зробити ефективне архівування з терміналу, подивіться тут на OSX.
І $ zip -r archive_name.zip folder_to_compress
для Windows. Або ж клієнта, такого як 7-Zip, було б достатньо для користувачів Windows
Я не бачу тут відповідей на Python. Ви можете завантажити папку сценаріїв за допомогою Python / boto3. Ось як рекурсивно отримати всі імена файлів з дерева каталогів:
def recursive_glob(treeroot, extention):
results = [os.path.join(dirpath, f)
for dirpath, dirnames, files in os.walk(treeroot)
for f in files if f.endswith(extention)]
return results
Ось як завантажити файл на S3 за допомогою Python / boto:
k = Key(bucket)
k.key = s3_key_name
k.set_contents_from_file(file_handle, cb=progress, num_cb=20, reduced_redundancy=use_rr )
Я використав ці ідеї для написання Directory-Uploader-For-S3
Я опинився тут, намагаючись зрозуміти це. З версією, яка зараз є там, ви можете перетягнути туди папку, і вона працює, хоча це не дозволяє вам вибрати папку під час відкриття діалогу завантаження.
Ви можете перетягувати ці папки. Функція перетягування підтримується лише для браузерів Chrome і Firefox . Будь ласка, зверніться за цим посиланням https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html
Ви можете використовувати Transfer Manager для завантаження декількох файлів, каталогів тощо. Докладніше про:
https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-transfermanager.html
Ви можете завантажувати файли, перетягуючи їх або вказуючи та клацаючи. Щоб завантажити папки, потрібно перетягнути їх. Функція перетягування підтримується лише для браузерів Chrome і Firefox
Розгляньте можливість використання безкоштовного програмного забезпечення CloudBerry Explorer для завантаження повної структури папок на Amazon S3.
Ви не можете завантажувати такі вкладені структури через Інтернет-інструмент. Я рекомендую використовувати щось на зразок Bucket Explorer для більш складних завантажень.