go从指定的URL下载图片并保存到本地的代码实现

 更新时间:2024年08月28日 09:18:03   作者:ZL_567  
这段代码定义了一个名为 downloadImage 的函数,其目的是从指定的URL下载图片并保存到本地文件系统,本文是对代码功能的详细描述,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

1.函数定义

该函数接受一个 imageName 参数,图片的文件名。

2.构建图片URL

使用 fmt.Sprintf 函数构建图片的URL,这个URL指向一个特定的网络路径,用于下载图片。

url := fmt.Sprintf("https://xxxxxxx.com.cn/pic/l/sevp_nsmc_wxbl_fy4b_etcc_achn_lno_py_%s", imageName)

3.检查图片是否存在:

发起一个HEAD请求到构建的URL,检查图片是否存在。

如果图片不存在(HTTP 404),记录一条日志并返回,不进行下载操作。

resp, err := http.Head(url)
if err != nil {
	log.Println(err)
	return // 发生错误时,跳过当前循环
}
defer resp.Body.Close()

if resp.StatusCode == http.StatusNotFound {
	log.Printf("图片 %s 不存在于服务器\n", imageName)
	return // 图片不存在时,跳过当前循环
}

4.下载图片

如果图片存在,发起一个GET请求,从URL下载图片。

response, err := http.Get(url)
if err != nil {
	log.Println(err)
	return
}

5.创建本地文件

根据图片名称和预设的路径创建一个本地文件夹,用于保存下载的图片。

filepath := fmt.Sprintf("./uploads/image/%s", imageName)
file, err := os.Create(filepath)
if err != nil {
	log.Println(err)
	return
}

6.保存图片到本地

下载的图片内容写入到本地文件中。

_, err = io.Copy(file, response.Body)
if err != nil {
	log.Println(err)
	return
}

7.完整代码

在整个过程中,对任何可能发生的错误进行捕获和记录。
使用 defer 语句确保在函数返回之前关闭打开的文件和网络连接,释放资源。

func downloadImage(imageName string) {
	url := fmt.Sprintf("https://xxxxxxx.com.cn/pic/l/sevp_nsmc_wxbl_fy4b_etcc_achn_lno_py_%s", imageName)
	// 如果不存在,检查 HTTP 状态码
	resp, err := http.Head(url)
	if err != nil {
		log.Println(err)
		return // 发生错误时,跳过当前循环
	}
	defer resp.Body.Close()

	if resp.StatusCode == http.StatusNotFound {
		log.Printf("图片 %s 不存在于服务器\n", imageName)
		return // 图片不存在时,跳过当前循环
	}
	response, err := http.Get(url)
	if err != nil {
		log.Println(err)
		return
	}
	defer response.Body.Close()

	filepath := fmt.Sprintf("./uploads/image/%s", imageName)
	file, err := os.Create(filepath)
	if err != nil {
		log.Println(err)
		return
	}
	defer file.Close()

	_, err = io.Copy(file, response.Body)
	if err != nil {
		log.Println(err)
		return
	}
}

总结

总结来说,这段代码的主要功能是尝试从指定的URL下载图片,并在下载前检查图片是否存在。如果存在,则下载并保存到本地;如果不存在,则记录错误并跳过下载。同时,它还处理了可能出现的错误,并确保在函数结束时正确地关闭了所有资源。

以上就是go从指定的URL下载图片并保存到本地的代码实现的详细内容,更多关于go从指定URL下载图片并保存的资料请关注脚本之家其它相关文章!

相关文章

  • 下载golang.org/x包的操作方法

    下载golang.org/x包的操作方法

    今天小编就为大家分享一篇下载golang.org/x包的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 详解Go语言中rand(随机数)包的使用

    详解Go语言中rand(随机数)包的使用

    在Golang中,有两个包提供了rand,分别为math/rand和crypto/rand对应两种应用场景。math/rand包实现了伪随机数生成器。也就是生成 整形和浮点型;crypto/rand包实现了用于加解密的更安全的随机数生成器。本文就来和大家详细讲讲math/rand的使用
    2022-08-08
  • Golang语言的跨平台UI工具包fyne使用详解

    Golang语言的跨平台UI工具包fyne使用详解

    这篇文章主要为大家介绍了Golang语言的跨平台UI工具包fyne使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • go语言中struct标签详解

    go语言中struct标签详解

    这篇文章主要给大家介绍了关于go语言中struct标签的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用go语言具有一定的参考学习价值,需要的朋友可以参考下
    2023-07-07
  • go语言中的数组指针和指针数组的区别小结

    go语言中的数组指针和指针数组的区别小结

    本文主要介绍了go语言中的数组指针和指针数组的区别小结,文中通过示例代码介绍的很详细,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • Golang测试func TestXX(t *testing.T)的使用详解

    Golang测试func TestXX(t *testing.T)的使用详解

    一般Golang中的测试代码都以xxx_test.go的样式,在命名测试函数的时候以Testxx开头,下面给大家介绍Golang测试func TestXX(t *testing.T)的使用,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 解决golang gin框架跨域及注解的问题

    解决golang gin框架跨域及注解的问题

    这篇文章主要介绍了解决golang gin框架跨域及注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 如何用go-zero 实现中台系统

    如何用go-zero 实现中台系统

    这篇文章主要介绍了如何用go-zero 实现中台系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • golang 日志库ZAP[uber-go zap]示例详解

    golang 日志库ZAP[uber-go zap]示例详解

    ZAP是由Uber开源的高性能Go语言日志库,支持多种日志级别及基本信息打印,虽然ZAP本身不支持日志分割,但可以结合lumberjack进行日志切割,实现日志按文件大小、时间或间隔切割等功能,ZAP提供Logger和SugaredLogger两种日志记录器
    2024-10-10
  • 图解Golang的GC垃圾回收算法

    图解Golang的GC垃圾回收算法

    这篇文章主要介绍了图解Golang的GC垃圾回收算法,详细的介绍了三种经典的算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论