我正在使用AWS SDK for Node.js在s3上创建文件夹或密钥。我在谷歌搜索,但我一无所获。有谁知道我如何使用AWS SDK for Node.js在我的桶下创建一个文件夹? 以及如何检查您的存储桶中是否存在此文件夹?
如果您使用console.aws.amazon.com
,则可以轻松地在存储桶中创建文件夹。好像我没弄清楚如何用AWS SDK for Node.js创建它?
答案 0 :(得分:41)
S3没有文件夹或文件;它有水桶和物体。存储桶用于存储对象,对象包含数据(可以是文件)和元数据(有关数据的信息)。
您无需在S3中预先创建文件夹结构。即使cars / ford /不存在,您也可以简单地使用key = cars / ford / focus.png放置一个对象。在这种情况下:
putObject调用会在cars / ford / focus.png中创建一个对象,但不会创建代表cars / ford /的中间文件夹结构的任何内容。< / p>
实际的文件夹结构不存在,但是当您致电listObjects,delimiter=/
中的文件夹和CommonPrefixes
中的文件时,Contents
隐含了这种结构。< / p>
您将无法使用headObject测试福特子文件夹,因为cars / ford /实际上并不存在(它不是对象)。相反,您有两个选项来查看它(逻辑上)是否存在:
Contents
CommonPrefixes
中找到它但是,如果您真的想要,可以创建表示文件夹的S3对象。例如,AWS S3控制台执行此操作。要在名为mybucket的存储桶中创建myfolder,可以使用bucket = mybucket,key = myfolder /和size 0发出putObject调用。请注意正斜杠。在这种情况下:
该文件夹实际上是一个零大小的对象,其键以/结尾。请注意,如果您不使用尾随/那么您将获得一个零大小的对象,该对象看起来像是文件而不是文件夹。
您现在可以通过使用bucket = mybucket和key = myfolder / subfolder /发出headObject调用来测试myfolder /子文件夹/ mybucket中是否存在。
最后,请注意您的文件夹分隔符可以是您喜欢的任何内容,例如+,因为它只是密钥的一部分,实际上不是文件夹分隔符(没有文件夹)。如果您愿意,可以通过listObjects调用来改变文件夹分隔符。
答案 1 :(得分:17)
来自@ user2837831的代码似乎不再起作用了,可能是新版本的javascript sdk。所以我在这里添加了我用来使用node.js在存储桶中创建文件夹的代码版本。这适用于2.1.31 sdk。重要的是params中Key值末尾的'/' - 使用它认为你试图创建一个文件夹而不是文件。
var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var s3Client = new AWS.S3();
var params = { Bucket: 'your_bucket_goes_here', Key: 'folderInBucket/', ACL: 'public-read', Body:'body does not matter' };
s3Client.upload(params, function (err, data) {
if (err) {
console.log("Error creating the folder: ", err);
} else {
console.log("Successfully created a folder on S3");
}
});
答案 2 :(得分:9)
存储桶中的文件夹只是另一个存储桶。因此,您可以使用headBucket
检查它是否存在,如果不存在则使用createBucket
创建它。像这样:
var AWS = require('aws-sdk'),
s3 = new AWS.S3(),
bucketFolder = 'bucketA/folderInBucketA';
s3.headBucket({Bucket:bucketFolder},function(err,data){
if(err){
s3.createBucket({Bucket:bucketFolder},function(err,data){
if(err){ throw err; }
console.log("Bucket created");
});
} else {
console.log("Bucket exists and we have access");
}
});
====更新2017-02-22 ====
正如评论中指出的那样,这是领先的。在2013年,我猜它确实导致创建了一个“文件夹”(就S3 UI而言)。
如果您使用当前的AWS开发工具包运行上述内容,它将在存储桶“bucketA”中的键“folderInBucketA”处创建一个空对象。我不认为这对任何人都有用,所以请忽略这个答案。
答案 3 :(得分:5)
我发现我们不再需要显式的目录创建调用了。
以下是我的工作,并根据需要自动创建目录层次结构。
var userFolder = 'your_bucket_name' + '/' + variable-with-dir-1-name + '/' + variable-with-dir-2-name;
// IMPORTANT : No trailing '/' at the end of the last directory name
AWS.config.region = 'us-east-1';
AWS.config.update({
accessKeyId: 'YOUR_KEY_HERE',
secretAccessKey: 'your_secret_access_key_here'
});
var bucket = new AWS.S3({
params: {
Bucket: userFolder
}
});
var contentToPost = {
Key: <<your_filename_here>>,
Body: <<your_file_here>>,
ContentEncoding: 'base64',
ContentType: <<your_file_content_type>>,
ServerSideEncryption: 'AES256'
};
bucket.putObject(contentToPost, function (error, data) {
if (error) {
console.log("Error in posting Content [" + error + "]");
return false;
} /* end if error */
else {
console.log("Successfully posted Content");
} /* end else error */
})
.on('httpUploadProgress',function (progress) {
// Log Progress Information
console.log(Math.round(progress.loaded / progress.total * 100) + '% done');
});
答案 4 :(得分:1)
这真的很简单,您可以使用以下命令来做到这一点,只记得后面的斜杠即可。
var AWS = require("aws-sdk");
var s3 = new AWS.S3();
var params = {
Bucket: "mybucket",
Key: "mykey/"
};
s3.putObject(params).promise();
答案 5 :(得分:-2)
在控制台中,首先生成的链接是存储区创建的路径,其次是文件夹结构。
public void verificaNumar (){
String cautare = editCauta.getText().toString();
if(myDb.cautaNumar(cautare)) {
Toast.makeText(MainActivity.this, "employee exist", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(MainActivity.this,"employee not found", Toast.LENGTH_LONG).show();
}
}