Golang下载图片

Go下载图像教程展示了如何在Go中下载图像文件。

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

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

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏