经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Go语言下载网络图片或文件的方法示例
来源:jb51  时间:2018/12/24 10:43:40  对本文有异议

最近闲来无事, 于是就简单学习了下Go语言的基本的用法。由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言

文件下载到本地,通常的思路就是先获得网络文件的 输入流 以及本地文件的 输出流 ,再读取输入流到输出流中,因此自然也要获取相应的 Reader 和 Writer 。

下面首先是使用GoLang的http.Get()方法(使用client的do方法原理类似)

  1. // 图片以花瓣网的图片为例
  2. imgUrl := "http://hbimg.b0.upaiyun.com/32f065b3afb3fb36b75a5cbc90051b1050e1e6b6e199-Ml6q9F_fw320"
  3.  
  4. res, err := http.Get(imgUrl)
  5. if err != nil {
  6. fmt.Println("A error occurred!")
  7. return
  8. }
  9. // defer后的为延时操作,通常用来释放相关变量
  10. defer res.Body.Close()
  11.  

然后获得get请求响应的reader对象

  1. // 获得get请求响应的reader对象
  2. reader := bufio.NewReaderSize(res.Body, 32 * 1024)

上面获取到了输入流的reader对象, 下面来获取本地文件的输出流的writer对象

  1. imgPath := "C:\\Users\\Asche\\go\\src\\GoSpiderTest\\"
  2. // 根据图片url获取其文件名
  3. fileName := path.Base(imgUrl)
  4.  
  5.  
  6. file, err := os.Create(imgPath + fileName)
  7. if err != nil {
  8. panic(err)
  9. }
  10. // 获得文件的writer对象
  11. writer := bufio.NewWriter(file)
  12.  

好了, reader和writer对象都得到了,然后在读取写入。

如果嫌麻烦的话,可以直接copy:

  1. written, _ := io.Copy(writer, reader)
  2. // 输出文件字节大小
  3. fmt.Printf("Total length: %d", written)

或则手动读取和写入

  1. bytes := make([]byte, 32 * 1024)
  2. for {
  3. len, err := reader.Read(bytes)
  4.  
  5. if len < 0 || err != nil{
  6. return
  7. }
  8. // 注意这里byte数组后的[0:len],不然可能会导致写入多余的数据
  9. _, _ = writer.Write(bytes[0:len])
  10. fmt.Printf("%d ", len)
  11. }
  12.  

ok,下载完成。

下面贴上完整的代码(读取写入采用的方法一)

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "os"
  9. "path"
  10. )
  11.  
  12. func main() {
  13. imgPath := "C:\\Users\\Asche\\go\\src\\GoSpiderTest\\"
  14. imgUrl := "http://hbimg.b0.upaiyun.com/32f065b3afb3fb36b75a5cbc90051b1050e1e6b6e199-Ml6q9F_fw320"
  15.  
  16. fileName := path.Base(imgUrl)
  17.  
  18.  
  19. res, err := http.Get(imgUrl)
  20. if err != nil {
  21. fmt.Println("A error occurred!")
  22. return
  23. }
  24. defer res.Body.Close()
  25. // 获得get请求响应的reader对象
  26. reader := bufio.NewReaderSize(res.Body, 32 * 1024)
  27.  
  28.  
  29. file, err := os.Create(imgPath + fileName)
  30. if err != nil {
  31. panic(err)
  32. }
  33. // 获得文件的writer对象
  34. writer := bufio.NewWriter(file)
  35.  
  36. written, _ := io.Copy(writer, reader)
  37. fmt.Printf("Total length: %d", written)
  38. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号