web-dev-qa-db-ja.com

Google APIを使用してGoogleストレージに空のフォルダーを作成するにはどうすればよいですか?

Google APIを使用してGoogleストレージに空のフォルダーを作成するにはどうすればよいですか? (と仮定する /はパス区切り文字です。)

16
porton

Google Cloud Storageにはフォルダやサブディレクトリはありません。ただし、それらをエミュレートするためのいくつかのサポートがあります。 gsutilの How Subdirectories Work は、いくつかのバックグラウンドに適しています。

Google Cloud Storageオブジェクトはフラットな名前空間ですが、gsutilやGoogle Cloud Storage UIを含む多くのツールは、階層的なファイルツリーのように見えます。

空のサブディレクトリの錯覚を作成するために広く使用されている2つの規則があります。

  1. (推奨)末尾のスラッシュで終わるオブジェクトを作成します。たとえば、バケットのルートにfooというサブディレクトリを作成するには、foo/という空のオブジェクト(サイズ0)を作成します。

  2. (legacy)名前に_$folder$を追加してオブジェクトを作成します。たとえば、バケットのルートにfooというサブディレクトリを作成するには、foo_$folder$という空のオブジェクト(サイズ0)を作成します。

現在、ほとんどのツールとユーティリティは方法1を使用しています。方法2はあまり使用されません。

15
jterrace

@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')
22
user2526241

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

結果は次のとおりです。

enter image description here

@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 Consoleでファイルを確認します。

enter image description here

1
slideshowp2

質問と選ばれたベストアンサーをありがとう。これが私が書いたコードスニペットです: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/')
0
sumon c