ZetCode

Go 下载图片

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何在 Go 中下载图片文件。

要下载图片,我们使用 net/httpreq 包。

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.ResponseWriterhttp.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 net/http 包 - 参考

在本文中,我们展示了如何在 Go 中下载图片文件。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写超过 1,400 篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程