Как создать пустую папку в Google Storage с помощью API Google?

Как создать пустую папку в Google Storage с помощью API Google? (Предположим, что / является разделителем путей.)

Ответ 1

Google Cloud Storage не имеет папок или подкаталогов. Тем не менее, есть некоторая поддержка для имитации их. gsutil Как работают подкаталоги, хорошо читается для некоторого фона.

Объекты Google Cloud Storage представляют собой плоское пространство имен, но многие инструменты, включая gsutil и пользовательский интерфейс облачного хранилища Google, создают иллюзию иерархического дерева файлов.

Существует два широко используемых соглашения для создания иллюзии пустого подкаталога:

  • (рекомендуется) Создайте объект, который заканчивается конечной косой чертой. Например, чтобы создать подкаталог под названием foo в корневом каталоге, вы должны создать пустой объект (размер 0) под названием foo/.

  • (наследие) Создайте объект с _$folder$, добавленным к имени. Например, чтобы создать подкаталог под названием foo в корневом каталоге, вы должны создать пустой объект (размер 0), называемый foo_$folder$.

Обратите внимание, что большинство инструментов и утилит теперь используют метод 1. Метод 2 реже используется.

Ответ 2

@SheRey - глядя на папки, созданные через веб-интерфейс GCS, 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')

Ответ 3

Спасибо за Вопрос и выбранный Лучший ответ. Вот фрагмент кода, который я написал: Метод 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

Node.js + @google-cloud/[email protected]^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

Вот документы API для @google-cloud/storage: 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:

enter image description here