Golang打开使用新包通过http请求发送的外部文件

时间:2017-01-14 20:43:05

标签: go

我正在使用Golang作为一个宁静的api。我有一个IOS应用程序,用户上传照片后,图像被发送到Golang,它处理图像并上传(到亚马逊s3),因此在我的本地目录中找不到图像。我之前使用FormFile来阅读诸如

之类的图像
func s3ImageUpload(w http.ResponseWriter, r *http.Request) {
     r.ParseForm()

     file, handler, err := r.FormFile("file")
     if err != nil {
         fmt.Println("Error Uploading Image")
         return
     }

  // Rest of Code that uploads Image to my Amazon s3 Bucket no issues here
}

上面代码的问题是,有时候上传的图片大小只有4MB而且太大了,所以我得到了一个新的包来调整图像https://www.github.com/disintegration/imaging的大小。我昨天发布了这个并获得了很大帮助并设法上传了我在本地目录中找到的图片,但是我需要找到如何加载来自外部的图像。我遇到的唯一问题是使用此程序包的 Open方法,根据go-docs,这是该方法的解释

func打开

func Open(filename string) (image.Image, error)

打开从文件加载图像

所以,如果我在本地目录中有一个图像并希望调整大小,我可以这样做

file_open,err := imaging.Open("/Users/IH/Documents/pictures/BigTurtle.jpg")

        if err != nil {
            print("Imaging Open error")
        }
        new_image := imaging.Resize(file_open, 300, 300, imaging.Lanczos)

//其余代码将新图像发送到亚马逊s3,它可以正常工作 这一切都有效,但如前所述,图像是从其他人的IOS设备外部传播的,所以我不能放入图像路径。我试过这样做

file_open,err := imaging.Open(handler.filename)

 file_open,err := imaging.Open("file")

但是它没有找到任何图像或目录,我是Golang的新手,但有一些方法可以将外部文件发送到imaging.open吗?  我需要那个,因为方法`imaging.Resize()的第一个参数是 image.Image 类型,它与 imaging.Open 的类型相同。不幸的是, r.FormFile(" file")属于Multipart.File类型,并且至少不能根据我的有限知识调整大小。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

无需打开图像;它已在请求中提供。

你可以按照以下方式做点什么:

file = r.FormFile()
img = image.Decode(file)
imgResized = imaging.Resize(img, ..)

Request.FormFile会返回multipart.File,这是一个io.Reader,因此可以传递给image.Decode以将图片传递给imaging.Resize

请记住检查并处理每个可能的错误。