我尝试将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)
}
}
答案 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上的数据集。