zoukankan      html  css  js  c++  java
  • Go语言下载网络图片或文件

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

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

    下面首先是使用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)
    }
    
    
    
  • 相关阅读:
    用NHibernate创建数据库时出现的问题
    Conceptual Overview (.NET 5概念描述)
    网页前端开发,对于图片慢加载简介
    opencv实现人脸识别(五) 运用tkinter进行GUI绘制 整合人脸识别模块
    opencv实现人脸识别(四) 人脸识别模块
    opencv实现人脸识别(三) 训练图片模块
    opencv实现人脸识别(二) 人脸图像采集模块
    opencv实现人脸识别(一)opencv的相关知识了解
    python实现文件搜索工具(简易版)
    expect实现非交互
  • 原文地址:https://www.cnblogs.com/asche/p/10162567.html
Copyright © 2011-2022 走看看