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教程。
