Go 下载图片
最后修改时间 2024 年 4 月 11 日
在本文中,我们将展示如何在 Go 中下载图片文件。
要下载图片,我们使用 net/http
和 req
包。
net/http
包提供了 HTTP 客户端和服务器实现,用于创建 GET 和 POST 请求。req
是一个具有许多便捷功能的第三方 HTTP 客户端。
Go 下载图片示例
在下一个示例中,我们使用 net/http
包下载一个图片文件。
main.go
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
函数将下载的数据从响应体复制到文件中。
下面是该示例的一个稍作修改的版本。
main.go
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 下载 Go 图片
下一个示例使用 Req 包下载图片。
maing.go
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 服务器,该服务器将图片作为字节流发送,以及一个下载该图片的客户端。
main.go
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
内容类型用于 PNG 图片。
w.Write(buf)
图片数据通过 Write
写入响应体。
以下是 http 客户端。
main.go
package main import ( "log" "github.com/imroc/req/v3" ) func main() { client := req.C() url := "https://:8080/image" _, err := client.R().SetOutputFile("sid.png").Get(url) if err != nil { log.Fatal(err) } }
我们使用 Req 包从自定义服务器获取图片。
来源
在本文中,我们展示了如何在 Go 中下载图片文件。