最常见的应该是使用 io/ioutil 包下的 io.WriteFile() 函数直接将响应写入到一个文件中
但是我们需要使用 ioutil.ReadAll(resp.Body) 先将所有的响应读出来放到内存中。如果文件太大,那么就会消耗很多内存。
io 包提供了 io.Copy() 方法,该方法实现了两个文件之间的拷贝。
func main() {
//发起http请求
res,err := http.Get("http://xxxxx.com")
if err!=nil{
log.Panicln(err)
return
}
//关闭释放
defer res.Body.Close()
data,dataErr:=ioutil.ReadAll(res.Body)
if dataErr !=nil{
log.Println(dataErr)
return
}
//存放请求回来的数据 用一个map接收
result := make(map[string]interface{})
if err :=json.Unmarshal(data,&result);err!=nil{
log.Println(err)
return
}
//根据结构数据格式 进行类型断言
list := result["data"].([]interface{})
for _,v := range list{
//类型断言
item := v.(map[string]interface{})
////开启goroutine 下载图片
go Download(item["coverImage"].(string))
}
}
//下载网络图片 保存到本地指定路径
func Download(url string){
//发起网络请求
res,err:=http.Get(url)
if err!=nil{
log.Println(err)
return
}
// defer 释放资源
defer res.Body.Close()
//定义文件名字
path := strings.Split(url,"/")
name := path[len(path)-1]
//创建文件
out,err:= os.Create("./static/img/"+name)
if err!=nil{
log.Println(err)
return
}
// defer延迟调用 关闭文件,释放资源
defer out.Close()
//添加缓冲 bufio 是通过缓冲来提高效率。
wt:=bufio.NewWriter(out)
_,_=io.Copy(wt,res.Body)
//将缓存的数据写入到文件中
_=wt.Flush()
}
复制代码