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 中下载图片文件。