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

por*_*ton 12 google-api google-cloud-storage

如何使用Google API在Google Storage上创建空文件夹?(假设这/是路径分隔符.)

use*_*241 16

@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')
Run Code Online (Sandbox Code Playgroud)

  • 感谢并祝贺您,您已经完成了 Google 认为“不可行”的任务 (https://issuetracker.google.com/issues/148487275)。 (4认同)

jte*_*ace 15

Google云端存储没有文件夹或子目录.但是,有一些支持来模仿它们.gsutil的Subdirectories工作原理对于某些背景来说是一个很好的阅读.

Google云端存储对象是一个扁平命名空间,但许多工具(包括gsutil和Google云端存储用户界面)都会产生分层文件树的错觉.

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

  1. (推荐)创建以尾部斜杠结尾的对象.例如,要创建一个foo在存储桶根目录调用的子目录,您将创建一个名为的空对象(大小为0)foo/.

  2. (legacy)创建一个_$folder$附加到名称的对象.例如,要创建一个foo在存储桶根目录调用的子目录,您将创建一个名为的空对象(大小为0)foo_$folder$.

请注意,大多数工具和实用程序现在使用方法1.方法2使用频率较低.

  • 信息是最新的:仍然无法使用 gsutil 创建目录占位符对象。 (2认同)
  • 好的,很高兴知道——你能提供一个如何使用 API/端点来做到这一点的例子吗?(如果可能,原始 https 或 python) (2认同)

sli*_*wp2 6

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'
      }
    });
  });
Run Code Online (Sandbox Code Playgroud)

结果是:

在此处输入图片说明

这是 API 文档@google-cloud/storagehttps : //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)
    }
}

Run Code Online (Sandbox Code Playgroud)

标准输出的输出:

?  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
Run Code Online (Sandbox Code Playgroud)

在谷歌云平台控制台查看文件:

在此处输入图片说明


sum*_*n c 5

感谢您提出问题和选择的最佳答案。这是我写的代码片段: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))
Run Code Online (Sandbox Code Playgroud)

调用该方法的主要代码:

folder = create_folder(bucket_name, 'test-folder/')
Run Code Online (Sandbox Code Playgroud)