如何使用Google API在Google Storage上创建空文件夹? (假设/
是路径分隔符。)
答案 0 :(得分:13)
Google云端存储没有文件夹或子目录。但是,有一些支持来模仿它们。 gsutil的How Subdirectories Work对某些背景来说是个很好的阅读。
Google云端存储对象是一个扁平命名空间,但许多工具(包括gsutil和Google云端存储用户界面)都会产生分层文件树的错觉。
有两种广泛使用的约定用于创建空子目录的错觉:
(推荐)创建以尾部斜杠结尾的对象。例如,要在存储桶的根目录中创建名为foo
的子目录,您将创建一个名为foo/
的空对象(大小为0)。
(旧版)创建名称后附加_$folder$
的对象。例如,要在存储桶的根目录中创建名为foo
的子目录,您将创建一个名为foo_$folder$
的空对象(大小为0)。
请注意,大多数工具和实用程序现在都在使用方法1。方法2的使用频率较低。
答案 1 :(得分:12)
@SheRey - 查看通过GCS Web界面创建的文件夹,Content-Type设置为application/x-www-form-urlencoded;charset=UTF-8
,但这并不重要。这是python中对我有用的东西:
# pip install google-cloud-storage
from google.cloud import storage
gcs_client = storage.Client(project='some_project')
bucket = gcs_client.get_bucket('some_bucket')
blob = bucket.blob('some/folder/name/')
blob.upload_from_string('', content_type='application/x-www-form-urlencoded;charset=UTF-8')
答案 2 :(得分:1)
如果您使用的是java
SDK,请尝试此操作。
Blob folderCreated = bucket.create(folder_name + "/", "".getBytes());
folder_name
应该以“ /”结尾答案 3 :(得分:0)
谢谢您提出的问题和所选的最佳答案。 这是我编写的代码段: Python方法:
def create_folder(bucket_name, destination_folder_name):
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(destination_folder_name)
blob.upload_from_string('')
print('Created {} .'.format(
destination_folder_name))
调用该方法的主要代码:
folder = create_folder(bucket_name, 'test-folder/')
答案 4 :(得分:0)
Node.js
+ @google-cloud/storage@^2.5.0
:
您只需要分配一个目的地,例如:<folder>/<file Name>
模式。
对于下面的示例,我使用uuid
作为文件夹名称来模拟每个用户都有一个文件夹来存储自己的文件。
it('should upload file and create a folder correctly', async () => {
const myStorage = new Storage({ keyFilename: path.resolve(__dirname, '../../../.gcp/cloud-storage-admin.json') });
const bucket = myStorage.bucket('ez2on');
const fileName = 'mmczblsq.doc';
const filePath = path.resolve(__dirname, `../../../tmp/${fileName}`);
const uuid = faker.random.uuid();
await bucket.upload(filePath, {
destination: `${uuid}/${fileName}`,
gzip: true,
metadata: {
cacheControl: 'public, max-age=31536000'
}
});
});
结果是:
以下是@google-cloud/storage
的API文档:https://googleapis.dev/nodejs/storage/latest/Bucket.html#upload
Go
+ cloud.google.com/go/storage
package main
import (
"cloud.google.com/go/storage"
"context"
"fmt"
"github.com/google/uuid"
"google.golang.org/api/option"
"io"
"log"
"os"
)
func main() {
ctx := context.Background()
opts := option.ClientOption(
option.WithCredentialsFile(os.Getenv("CredentialsFile")),
)
client, err := storage.NewClient(ctx, opts)
if err != nil {
log.Fatalf("%v", err)
}
filename := "mmczblsq.doc"
filepath := fmt.Sprintf("./tmp/%s", filename)
file, err := os.Open(filepath)
if err != nil {
log.Fatalf("%v", err)
}
defer file.Close()
uuidIns, err := uuid.NewUUID()
if err != nil {
log.Fatalf("%v", err)
}
object := fmt.Sprintf("%s/%s", uuidIns, filename)
log.Printf("object name: %s", object)
wc := client.Bucket("ez2on").Object(object).NewWriter(ctx)
if _, err := io.Copy(wc, file); err != nil {
log.Fatalf("%v", err)
}
if err := wc.Close(); err != nil {
log.Fatalf("%v", err)
}
}
stdout的输出:
☁ upload [master] ⚡ CredentialsFile=/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/.gcp/cloud-storage-admin.json go run main.go
2019/07/08 14:47:59 object name: 532a2250-a14c-11e9-921d-8a002870ac01/mmczblsq.doc
在Google Cloud Platform控制台中检查文件:
答案 5 :(得分:0)
我在命名要写入的对象时“创建”了文件夹。
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob("new_folder_name/destination_blob_name")
blob.upload_from_filename(source_file_name)
答案 6 :(得分:0)
我试图从CircleCI实例在Google存储桶上创建一个唯一的子目录。这是我使用gsutil的方法。我创建了一个虚拟文件。我还用斜杠将文件夹名称附加到目标存储桶名称上。
Usage: gsutil cp OBJECT_LOCATION gs://DESTINATION_BUCKET_NAME/
sudo gsutil cp ~/some-path/dummyFile.txt gs://my-bucket/unique-folder-name/