如何使用golang编辑云存储桶中对象的元数据信息

时间:2016-04-05 07:59:35

标签: go google-cloud-storage metadatatype

我尝试将csv文件从本地计算机插入云存储桶,但它存储为文本文件。当我尝试在

中包含元数据选项时

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

它正在创建另一个插槽Content-Type并存储数据但不更改默认值。尝试了谷歌的大多数选项,但无法解决此问题。以下是代码段。

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


}

2 个答案:

答案 0 :(得分:1)

Metadata是一个字符串 - >自定义,用户定义的对象属性的字符串映射。您正在寻找的是ContentType

object := &storage.Object{Name: objectName, ContentType: "text/csv; charset=utf-8"}

答案 1 :(得分:1)

联系Google Tech支持。他们给出了以下答案,并且工作得很好。

  

我发现根本原因解释了为什么通过CS设置Content-type   API是“text / plain; charset = utf-8”而不是“text / csv;   字符集= UTF-8" 。

     

CLI-Go reference函数Media()上所描述的:   上传请求中使用的Content-Type标头将由。确定   嗅探r的内容,除非MediaOption生成   提供了googleapi.ContentType。

     

因此,要生成MediaOption,您需要致电googleapi.ContentType

     

我通过导入“google.golang.org/api/googleapi”修改了您的脚本   并调用insert如下:

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

似乎Media()会覆盖Object上的数据集。