Golang将URL中的文件保存到AppEngine中的GCS存储桶

huangapple go评论121阅读模式
英文:

Golang Save File from URL to GCS Bucket in AppEngine

问题

我正在尝试从URL获取图像文件,并使用这里的文档将其保存到GCS存储中。

在我的AppEngine环境中,我无法弄清楚如何从response.Body创建文件并将其保存到GSC中...在这个环境中,我不能使用os.Create并引用文件路径,对吗?

  • 寻找在部署在AppEngine中时将response.Body传递给wc.Write()方法的提示。

获取文件的代码:

  1. func main() {
  2. url := "http://i.imgur.com/m1UIjW1.jpg"
  3. // 不用担心错误
  4. response, e := http.Get(url)
  5. if e != nil {
  6. log.Fatal(e)
  7. }
  8. defer response.Body.Close()
  9. // 打开一个文件进行写入
  10. file, err := os.Create("/tmp/asdf.jpg")
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. // 使用io.Copy将响应体直接转储到文件中。这支持大文件
  15. _, err = io.Copy(file, response.Body)
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. file.Close()
  20. fmt.Println("Success!")
  21. }

将本地文件保存到GCS:

  1. func (d *demo) createFile(fileName string) {
  2. fmt.Fprintf(d.w, "Creating file /%v/%v\n", d.bucketName, fileName)
  3. wc := d.bucket.Object(fileName).NewWriter(d.ctx)
  4. wc.ContentType = "text/plain"
  5. wc.Metadata = map[string]string{
  6. "x-goog-meta-foo": "foo",
  7. "x-goog-meta-bar": "bar",
  8. }
  9. d.cleanUp = append(d.cleanUp, fileName)
  10. if _, err := wc.Write([]byte("abcde\n")); err != nil {
  11. d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
  12. return
  13. }
  14. if _, err := wc.Write([]byte(strings.Repeat("f", 1024*4) + "\n")); err != nil {
  15. d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
  16. return
  17. }
  18. if err := wc.Close(); err != nil {
  19. d.errorf("createFile: unable to close bucket %q, file %q: %v", d.bucketName, fileName, err)
  20. return
  21. }
  22. }

你可以在这里找到有关从URL保存图像文件的更多信息。

英文:

I'm trying to get a image file from URL and save it to GCS storage using the documentation here.

I can't figure out how to create the file from response.Body to GSC given my AppEngine environment... I can't create using os.Create and reference a file path in this environment, right?

  • Looking for tips on passing the response.Body to the wc.Write() method while deployed in AppEngine.

Code to get file:

  1. func main() {
  2. url := "http://i.imgur.com/m1UIjW1.jpg"
  3. // don't worry about errors
  4. response, e := http.Get(url)
  5. if e != nil {
  6. log.Fatal(e)
  7. }
  8. defer response.Body.Close()
  9. //open a file for writing
  10. file, err := os.Create("/tmp/asdf.jpg")
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. // Use io.Copy to just dump the response body to the file. This supports huge files
  15. _, err = io.Copy(file, response.Body)
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. file.Close()
  20. fmt.Println("Success!")
  21. }

Save a local file to GCS

  1. func (d *demo) createFile(fileName string) {
  2. fmt.Fprintf(d.w, "Creating file /%v/%v\n", d.bucketName, fileName)
  3. wc := d.bucket.Object(fileName).NewWriter(d.ctx)
  4. wc.ContentType = "text/plain"
  5. wc.Metadata = map[string]string{
  6. "x-goog-meta-foo": "foo",
  7. "x-goog-meta-bar": "bar",
  8. }
  9. d.cleanUp = append(d.cleanUp, fileName)
  10. if _, err := wc.Write([]byte("abcde\n")); err != nil {
  11. d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
  12. return
  13. }
  14. if _, err := wc.Write([]byte(strings.Repeat("f", 1024*4) + "\n")); err != nil {
  15. d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
  16. return
  17. }
  18. if err := wc.Close(); err != nil {
  19. d.errorf("createFile: unable to close bucket %q, file %q: %v", d.bucketName, fileName, err)
  20. return
  21. }
  22. }

答案1

得分: 0

看起来你正在寻找一个Writer和一个bytes.Buffer

  1. var buff bytes.Buffer
  2. writer := NewWriter(buff)
  3. n, err := io.Copy(writer, response.Body)
英文:

It seems like you are looking for a Writer and a bytes.Buffer:

  1. var buff bytes.Buffer
  2. writer := NewWriter(buff)
  3. n, err := io.Copy(writer, response.Body)

huangapple
  • 本文由 发表于 2017年1月23日 01:30:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/41794004.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定