Go下载图像教程展示了如何在Go中下载图像文件。
要下载图像,我们使用net/http
和req
包。
net/http
包提供HTTP客户端和服务器实现,用于创建GET和POST请求。req
是一个具有许多便利功能的第三方HTTP客户端。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
去下载图片示例
在下一个例子中,我们使用net/http
包来下载一个图像文件。
package main import ( "fmt" "io" "log" "net/http" "os" ) func main() { fname := "favicon.ico" f, err := os.Create(fname) if err != nil { log.Fatal(err) } defer f.Close() url := "http://webcode.me/favicon.ico" res, err := http.Get(url) if err != nil { log.Fatal(err) } defer res.Body.Close() _, err = io.Copy(f, res.Body) if err != nil { log.Fatal(err) } fmt.Println("image downloaded") }
我们下载一个图标。
f, err := os.Create(fname)
使用os.Create
,我们创建了一个文件,我们在其中写入了二进制数据。
url := "http://webcode.me/favicon.ico" res, err := http.Get(url)
为了获取图像,我们使用http.Get
生成GET请求。
_, err = io.Copy(f, res.Body)
我们使用io.Copy
函数将下载的数据从响应正文复制到文件中。
以下是示例的略微修改版本。
package main import ( "fmt" "log" "net/http" "os" "path" ) func main() { url := "http://webcode.me/favicon.ico" r, err := http.Get(url) if err != nil { log.Fatal(err) } defer r.Body.Close() fname := path.Base(url) f, err := os.Create(fname) if err != nil { log.Fatal(err) } defer f.Close() _, err = f.ReadFrom(r.Body) if err != nil { log.Fatal(err) } fmt.Println("image downloaded") }
我们使用ReadFrom
函数将下载的数据写入新创建的文件中。
用Req去下载图片
下一个示例使用Req包下载图像。
package main import ( "log" "github.com/imroc/req/v3" ) func main() { client := req.C() url := "http://webcode.me/favicon.ico" _, err := client.R().SetOutputFile("favicon.ico").Get(url) if err != nil { log.Fatal(err) } }
使用Req包,我们的代码变得更短。
从自定义服务器下载图片
在下一个示例中,我们创建一个简单的Web服务器,它以字节流的形式发送图像,并创建一个下载该图像的客户端。
package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { handler := http.HandlerFunc(handleRequest) http.Handle("/image", handler) fmt.Println("Server started at port 8080") http.ListenAndServe(":8080", nil) } func handleRequest(w http.ResponseWriter, r *http.Request) { buf, err := ioutil.ReadFile("sid.png") if err != nil { log.Fatal(err) } w.Header().Set("Content-Type", "image/png") w.Write(buf) }
该示例创建了一个简单的Web服务器,用于向客户端发送图像。该图像位于当前工作目录中。
handler := http.HandlerFunc(handleRequest) http.Handle("/image", handler)
我们将处理程序映射到/image
路径。
func handleRequest(w http.ResponseWriter, r *http.Request) { ...
处理函数接受两个参数:http.ResponseWriter
和http.Request
。
buf, err := ioutil.ReadFile("sid.png")
我们将图像读入缓冲区。
w.Header().Set("Content-Type", "image/png")
我们设置标题。Content-Type
内容类型用于PNGimage。
w.Write(buf)
图像数据通过Write
写入响应体。
下面是http客户端。
package main import ( "log" "github.com/imroc/req/v3" ) func main() { client := req.C() url := "http://localhost:8080/image" _, err := client.R().SetOutputFile("sid.png").Get(url) if err != nil { log.Fatal(err) } }
我们使用Req包从自定义服务器获取图像。
在本教程中,我们展示了如何在Go中下载图像文件。
列出所有Go教程。