Как отредактировать метаданные объекта в корзине облачного хранилища с помощью golang

Я попытался вставить CSV-файл с локального компьютера в корзину облачного хранилища, но он сохраняется в виде текстового файла. Когда я попытался включить параметр метаданных в

object := &storage.Object{Name: objectName, Metadata: map[string]string{"Content-Type": "text/csv; charset=utf-8"}}

Он создает еще один слот Content-Type и сохраняет данные, но не меняет значение по умолчанию. Пробовал большинство вариантов от google, но не смог решить эту проблему. Ниже приведен фрагмент кода.

package main

import (
        "flag"
        "fmt"
        "os"
        "golang.org/x/net/context"
        "golang.org/x/oauth2/google"
        storage "google.golang.org/api/storage/v1"
)

const (
        // This can be changed to any valid object name.
        objectName = "result"
        // This scope allows the application full control over resources in Google Cloud Storage
        scope = storage.DevstorageFullControlScope
)

var (
        projectID  = flag.String("project", "phani-1247 ", "Your cloud project ID.")
        bucketName = flag.String("bucket", "test-csvstorage", "The name of an existing bucket within your project.")
        fileName   = flag.String("file", "/home/phanikumar_dytha0/src/phani-1247/master/router/result.csv", "The file to upload.")
)



func main() {
        flag.Parse()
       client, err := google.DefaultClient(context.Background(), scope)
        if err!=nil{
            fmt.Printf("error")
        }
        // Insert an object into a bucket.
        object := &storage.Object{Name: objectName, Metadata: map[string]string{"Content-Type": "text/csv; charset=utf-8"}}
        file, err := os.Open(*fileName)
        if err!=nil{
            fmt.Printf("error")
        }
        service, err := storage.New(client)
        if err!=nil{
            fmt.Printf("error")
        }

        if res, err := service.Objects.Insert(*bucketName, object).Media(file).Do(); err == nil {
                //fmt.Printf("%v",res,"\n")
                fmt.Printf("Created object %v at location %v\n\n", res.Name, res.SelfLink)
        } else {
                fmt.Printf("Objects.Insert failed: %v", err)
        }


}

person Phani Kumar Dytha    schedule 05.04.2016    source источник


Ответы (2)


Связался с техподдержкой Google. Они дали следующий ответ, и это сработало отлично.

Я нашел основную причину, объясняющую, почему Content-type, установленный через CS API, имеет значение «text/plain; charset=utf-8» вместо «text/csv; charset=utf-8».

Как описано в справочнике по CLI-Go, функция Media (): заголовок Content-Type, используемый в запросе на загрузку, будет определяться путем прослушивания содержимого r, если только не предоставлен MediaOption, сгенерированный googleapi.ContentType.

Таким образом, чтобы сгенерировать MediaOption, вам нужно вызвать googleapi.ContentType:

Я изменил ваш скрипт, импортировав "google.golang.org/api/googleapi" и вызвав вставку следующим образом:

service.Objects.Insert(*bucketName,
object).Media(file,googleapi.ContentType("text/csv;
charset=utf-8")).Do();

Кажется, что Media() переопределяет набор данных в Object.

person Phani Kumar Dytha    schedule 05.04.2016

Metadata — это карта строк -> строк пользовательских, определяемых пользователем свойств объекта. То, что вы ищете, это ContentType.

object := &storage.Object{Name: objectName, ContentType: "text/csv; charset=utf-8"}
person Brandon Yarbrough    schedule 05.04.2016
comment
Привет, Брэндон. Я тоже пробовал это, но это не работает, тип файла по-прежнему текстовый/обычный, когда я загружаю файл в корзину через код. - person Phani Kumar Dytha; 05.04.2016