Go语言下载网络图片或文件的方法示例

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

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

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

// 图片以花瓣网的图片为例
  imgUrl := "http://hbimg.b0.upaiyun.com/32f065b3afb3fb36b75a5cbc90051b1050e1e6b6e199-Ml6q9F_fw320"

  res, err := http.Get(imgUrl)
  if err != nil {
    fmt.Println("A error occurred!")
    return
  }
  // defer后的为延时操作,通常用来释放相关变量
  defer res.Body.Close()

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

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

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

imgPath := "C:\\Users\\Asche\\go\\src\\GoSpiderTest\\"
  // 根据图片url获取其文件名
  fileName := path.Base(imgUrl)

    file, err := os.Create(imgPath + fileName)
  if err != nil {
    panic(err)
  }
  // 获得文件的writer对象
  writer := bufio.NewWriter(file)

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

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

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

或则手动读取和写入

bytes := make([]byte, 32 * 1024)
  for {
    len, err := reader.Read(bytes)

    if len < 0 || err != nil{
      return
    }
    // 注意这里byte数组后的[0:len],不然可能会导致写入多余的数据
    _, _ = writer.Write(bytes[0:len])
    fmt.Printf("%d ", len)
  }

ok,下载完成。

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

package main

import (
  "bufio"
  "fmt"
  "io"
  "net/http"
  "os"
  "path"
)

func main() {
  imgPath := "C:\\Users\\Asche\\go\\src\\GoSpiderTest\\"
  imgUrl := "http://hbimg.b0.upaiyun.com/32f065b3afb3fb36b75a5cbc90051b1050e1e6b6e199-Ml6q9F_fw320"

  fileName := path.Base(imgUrl)

  res, err := http.Get(imgUrl)
  if err != nil {
    fmt.Println("A error occurred!")
    return
  }
  defer res.Body.Close()
  // 获得get请求响应的reader对象
  reader := bufio.NewReaderSize(res.Body, 32 * 1024)

  file, err := os.Create(imgPath + fileName)
  if err != nil {
    panic(err)
  }
  // 获得文件的writer对象
  writer := bufio.NewWriter(file)

  written, _ := io.Copy(writer, reader)
  fmt.Printf("Total length: %d", written)
}

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

(0)

相关推荐

  • GO语言运行环境下载、安装、配置图文教程

    一.Go语言下载 go语言官方下载地址:https://golang.org/dl/ 找到适合你系统的版本下载,本人下载的是windows版本.也可以下载Source自己更深层次研究go语言. 二.GO语言安装 下载完成之后,双击go1.6.windows-amd64.msi进行安装. 如果安装过程出现以下提示: 以管理员的身份运行cmd,找到go1.6.windows-amd64.msi所在的目录,并输入msiexec /i go1.6.windows-amd64.msi如下图(放在D盘根目录

  • go语言读取json并下载高清妹子图片

    学了一天golang,一边看文档一边写的go读取分析json并下载图片 json api为爱壁纸HD mac 1920x1200版本,高清妹子图 总结:go+json=shit package main import ( "fmt" "io" "io/ioutil" "net/http" "os" "path/filepath" "strconv" //"e

  • Go语言下载网络图片或文件的方法示例

    最近闲来无事, 于是就简单学习了下Go语言的基本的用法.由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言 文件下载到本地,通常的思路就是先获得网络文件的 输入流 以及本地文件的 输出流 ,再读取输入流到输出流中,因此自然也要获取相应的 Reader 和 Writer . 下面首先是使用GoLang的http.Get()方法(使用client的do方法原理类似) // 图片以花瓣网的图片为例 imgUrl := "http://hbimg.b0.upaiyun.com/

  • Go语言写入字符串到文件的方法

    本文实例讲述了Go语言写入字符串到文件的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package  main import "fmt" import "os" func main() {     fileName := "test.dat"     dstFile,err := os.Create(fileName)     if err!=nil{         fmt.Println(err.Error())  

  • golang并发下载多个文件的方法

    背景说明 假设有一个分布式文件系统,现需要从该系统中并发下载一部分文件到本地机器. 已知该文件系统的部分节点ip, 以及需要下载的文件fileID列表,并能通过这些信息来拼接下载地址. 其中节点ip列表保存在xx_node.txt, 要下载的fileID保存在xx_fileID.txt中. 代码示例 package main import ( "bufio" "flag" "fmt" "io" "math/rand&

  • Python实现合并同一个文件夹下所有PDF文件的方法示例

    本文实例讲述了Python实现合并同一个文件夹下所有PDF文件的方法.分享给大家供大家参考,具体如下: 一.需求说明 下载了网易云课堂的吴恩达免费的深度学习的pdf文档,但是每一节是一个pdf,我把这些PDF文档放在一个文件夹下,希望合并成一个PDF文件.于是写了一个python程序,很好的解决了这个问题. 二.数据形式 三.合并效果 四.python代码实现 # -*- coding:utf-8*- import sys reload(sys) sys.setdefaultencoding('

  • C语言中可变参数的使用方法示例

    前言 在C语言程序编写中我们使用最多的函数一定包括printf以及很多类似的变形体.这个函数包含在C库函数中,定义为 int printf( const char* format, ...); 除了一个格式化字符串之外还可以输入多个可变参量,如: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s", i, s); 格式化字符串的判断本章暂且不论,下面分析一

  • Python如何把字典写入到CSV文件的方法示例

    在实际数据分析过程中,我们分析用Python来处理数据(海量的数据),我们都是把这个数据转换为Python的对象的,比如最为常见的字典. 比如现在有几十万份数据(当然一般这么大的数据,会用到数据库的概念,不会去在CPU内存里面运行),我们不可能在Excel里面用函数进行计算一些值吧,这样是不现实的. Excel只适合处理比较少的数据,具有方便快速的优势 那么我们假设是这么多数据,现在我要对这个数据进行解析,转换,最后数据分析,处理,然后写入数据到CSV文件,这样才达到要求,那么如何把数据字典写入

  • Go语言反射获取类型属性和方法示例

    本系列文章,我将会进一步加深对 Go 语言的讲解,更一步介绍 Go 中的包管理.反射和并发等高级特性. 前面一篇文章主要介绍了 reflect.Type 类型对象.本文将会继续介绍 Go 反射 reflect.StructField 和 reflect.Method 相关的内容. reflect.StructField 和 reflect.Method 如果变量是一个结构体,我们还可以通过结构体域类型对象 reflect.StructField 来获取结构体下字段的类型属性.Type 接口下提供

  • PHP实现打包下载文件的方法示例

    本文实例讲述了PHP实现打包下载文件的方法.分享给大家供大家参考,具体如下: /** * 下载文件 * @param $img * @return string */ public function Download($img) { $items = []; $names = []; if($img) { //用于前端跳转zip链接拼接 $path_redirect = '/zip/'.date('Ymd'); //临时文件存储地址 $path = '/tmp'.$path_redirect;

  • Spring Mvc下实现以文件流方式下载文件的方法示例

    项目中需要对一个点击事件进行下载操作,同时通过点击事件,已经可以从jsp页面获取到需要访问的URL和下载的文件名(数据库获取,jsp页面显示).点击事件JS如下: function downloadFile(filePath,fileName){ fileName = fileName.substr(0,fileName.lastIndexOf(".")); $.ajax({ async : false, cache:false, type: 'get', dataType : &qu

  • 原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】

    本文实例讲述了原生PHP实现导出csv格式Excel文件的方法.分享给大家供大家参考,具体如下: 效果图 源码分析 index.php <?php require_once "./Export.php"; //测试数据 $headerList= ['列名1','列名2','列名3']; $data = [ ['值1','值2','值3'], ['值11','值22','值33'], ['值111','值222','值333'] ]; $fileName = "测试导出文

随机推荐