読者です 読者をやめる 読者になる 読者になる

golangでGCSにzipファイルをアップロードする

zipだからといって、特別なことは必要ない。
普通に書き込めばいいだけなので、
zipファイルを読み込んで、
以下のGCSのサンプルにあるように wc.Wtite() に []byte を渡してやればいい。
https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/examples/storage/appengine/app.go#L150


HTMLのformからアップロードしたzipの読み込んで、
wc.Write() に書き込むコードは以下。
zipの読み込みも単なるファイル読み込み。

f, _, err := c.Request.FormFile("client_file")
if err != nil {
    return err
}

fileBuf := make([]byte, 1024)
for {
    n, err := f.Read(fileBuf)
    if err != nil {
        return err
    }
    if 0 == n {
        break
    }
}

//この辺のコードはサンプルをそのまま利用しているだけ
wc := d.bucket.Object(fileName).NewWriter(d.ctx)
wc.ContentType = "text/plain"
wc.Metadata = map[string]string{
    "x-goog-meta-foo": "foo",
    "x-goog-meta-bar": "bar",
}
d.cleanUp = append(d.cleanUp, fileName)

//fileBuf にzipが読み込まれているので、fileBufを wc.Wtite() に突っ込むだけ。
if _, err := wc.Write(fileBuf); err != nil {
    d.errorf("createFile: unable to write data to bucket %q, file %q: %v", bucket, fileName, err)
    return
}
if err := wc.Close(); err != nil {
    d.errorf("createFile: unable to close bucket %q, file %q: %v", bucket, fileName, err)
    return
}