如何使用 Google API 在 Google Storage 上创建空文件夹?

问题描述 投票:0回答:9

如何使用 Google API 在 Google Storage 上创建空文件夹? (假设

/
是路径分隔符。)

google-api google-cloud-storage
9个回答
53
投票

@SheRey - 查看通过 GCS Web 界面创建的文件夹,内容类型设置为

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')

29
投票

Google Cloud Storage 没有文件夹或子目录。然而,有一些支持模仿它们。 gsutil 的 子目录如何工作 对于一些背景知识来说是一本很好的读物。

Google Cloud Storage 对象是一个平面命名空间,但许多工具(包括 gsutil 和 Google Cloud Storage UI)创建了分层文件树的错觉。

有两种广泛使用的约定来创建空子目录的错觉:

  1. (推荐) 创建一个以斜杠结尾的对象。例如,要在存储桶的根部创建一个名为

    foo
    的子目录,您需要创建一个名为
    foo/
    的空对象(大小为 0)。

  2. (旧版) 创建一个名称后附加

    _$folder$
    的对象。例如,要在存储桶的根部创建一个名为
    foo
    的子目录,您需要创建一个名为
    foo_$folder$
    的空对象(大小为 0)。

请注意,大多数工具和实用程序现在都使用方法 1。方法2不太常用。


12
投票

感谢您提出问题并选择最佳答案。 这是我写的代码片段: 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/')

11
投票

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)
    }
}

标准输出的输出:

☁  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云平台控制台查看文件:


4
投票

如果您正在使用

java
SDK,请尝试此操作。

Blob folderCreated = bucket.create(folder_name + "/", "".getBytes());
  1. folder_name
    应以“/”结尾
  2. 上传空字节

1
投票

我是通过在命名要写入的对象时“创建”文件夹来完成的。

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)

1
投票

我试图从 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/

1
投票

这似乎对我的节点有用

import os = require('os');

const tempFilePath = path.join(os.tmpdir(), 'temp.txt');
fs.writeFileSync(tempFilePath, '');
await admin.storage().bucket().upload(tempFilePath, {
  destination: `other-folders/new-folder/`,
});

0
投票

使用node.js sdk

const { Storage } = require('@google-cloud/storage');
const storage = new Storage();

async function addEmptyFolder() {
  return storage.bucket('my-bucket')
    .file('folderA/folderB/')
    .save('');
}
© www.soinside.com 2019 - 2024. All rights reserved.