golang 根据基础的url下载静态服务器上所有的文件

Posted myuniverse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 根据基础的url下载静态服务器上所有的文件相关的知识,希望对你有一定的参考价值。

功能

  • 根据静态服务器上基础的url,获取所有的文件

运用到的知识点

  • 日志处理
    • 能在控制台打印,又能写入文件
  • 向服务端发送get请求
    • http.Get(url)
  • 递归获取文件夹和创建文件夹
package main



import (

?    "fmt"

?    "io"

?    "io/ioutil"

?    "log"

?    "net/http"

?    "os"

?    "regexp"

?    "strings"

?    "time"

)



var (

?    baseurl = "基础url"  

?    basePath = "D:\\staticFile"  //本地地址

?    logger *log.Logger

)



func init()

?    fmt.Println("创建日记录日志文件")

?    f,err:=os.OpenFile("Log.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 666)

?    if err!=nil

?        log.Fatal("os.OpenFile err",err)

?    

?    writers := []io.Writer

?        f,

?        os.Stdout

?    //defer f.Close()  因为这里,就已经将文件关闭了,看来不能够随便使用defer

?    fileAndStdoutWriter := io.MultiWriter(writers...)

?    logger = log.New(fileAndStdoutWriter, "", log.Ldate|log.Ltime|log.Lshortfile)

?    logger.Println("---> logger:check to make sure is works")





func main()

?    logger.Println("开始计算时间")

?    t1:=time.Now()

?    HandleFile(baseurl)

?    t2:=time.Now()

?    logger.Println("下载所有的文件总耗时:",t2.Sub(t1))





//遍历指定路径下的所有文件,filepath.Walk("路径",walkFunc)

func walkFunc(path string,info os.FileInfo,err error)error

?    fmt.Println(path)

?    return nil





//处理文件信息

func HandleFile(url string)error

?    if url==""

?        err:=fmt.Errorf("url是空的")

?        logger.Println(err)

?        return err

?    

?    logger.Println("发起get请求")

?    htmlData,err:= HttpGet(url)

?    if htmlData==""

?        err:=fmt.Errorf("HttpGet中有错啦,请检查HttpGet数据")

?        logger.Println(err)

?        return err

?    

?    if err!=nil

?        logger.Println(err)

?        return err

?    

?    cutUrl := strings.Split(url,"基础url")[1]

?    logger.Println("正则匹配信息")

?    re:=regexp.MustCompile(<a href="(.*?)">(.*?)</a>)

?    result := re.FindAllStringSubmatch(htmlData,-1)

?    if result==nil

?        err:=fmt.Errorf("正则匹配的数据为空")

?        logger.Println(err)

?        return err

?    

?    logger.Println("正则匹配数据")

?    for i:=0;i<len(result);i++

?        publicPath := cutUrl

?        if len(result[i])!=3

?            err:=fmt.Errorf("正则出来的东西不是我想要的")

?            logger.Println(err)

?            return err

?        

?        fmt.Println(result[i][2])

?        if strings.Contains(result[i][2],"/")

?            logger.Println(result[i][2]+"是个文件夹")

?            floderName:=strings.Replace(result[i][2],"/","",-1)

?            if floderName!=result[i][2]

?                publicPath = publicPath+"/"+floderName

?                fmt.Println("publicPath=============>",publicPath)

?                logger.Println("创建文件夹")

?                err=CreateFloder(publicPath)

?                if err!=nil

?                    logger.Println("CreateFloder error",err)

?                    return err

?                

?                urlPath := baseurl+publicPath+"/"

?                fmt.Println("urlPath============>",urlPath)

?                logger.Println("递归")

?                HandleFile(urlPath)

?            

?        else

?            publicPath = publicPath+result[i][2]

?            logger.Println("遇到是文件,就将数据写入文件")

?            err:=WriteFile(publicPath)

?            if err!=nil

?                logger.Println(err)

?                return err

?            

?        

?    

?    return nil





//发起get请求

func HttpGet(url string)(string,error)

?    if url==""

?        err:= fmt.Errorf("传入的url为空")

?        logger.Println(err)

?        return "",err

?    

?    if !strings.Contains(url,"http:")

?        err:=fmt.Errorf("传入的url不正确")

?        logger.Println(err)

?        return "",err

?    

?    resp,err:=http.Get(url)

?    if err!=nil

?        err1:= fmt.Errorf("http.Get error===========>%v",err)

?        logger.Println(err1)

?        return "",err1

?    

?    defer resp.Body.Close()

?    body,err := ioutil.ReadAll(resp.Body)

?    if err!=nil

?        err1:=fmt.Errorf("ioutil.ReadAll error===========>%v",err)

?        logger.Println(err1)

?        return "",err1

?    

?    if strings.Contains(string(body),"404 page not found")

?        err:=fmt.Errorf("找不到该网页")

?        logger.Println(err)

?        return "",err

?    

?    return string(body),nil





//判断文件是否存在

func IsExist(path string)(bool)

?    if path==""

?        return false

?    

?    _,err:=os.Stat(path)

?    if err!=nil

?        if os.IsExist(err)

?            return true

?        else

?            return false

?        

?    

?    return true





//创建文件夹

func CreateFloder(publicPath string)(error)

?    if publicPath==""

?        err:=fmt.Errorf("传入urlpath的地址空")

?        logger.Println(err)

?        return err

?    

?    logger.Println(publicPath,"创建文件夹")

?    err:=os.MkdirAll(basePath+"//"+publicPath,os.ModePerm)

?    if err!=nil

?        err:=fmt.Errorf("创建文件错误啦:%v",err)

?        logger.Println(err)

?        return err

?    

?    return nil





//写入文件

func WriteFile(publicPath string)error

?    if publicPath==""

?        err:=fmt.Errorf("传入的参数为空,请注意!!!")

?        logger.Println(err)

?        return err

?    

?    htmlData,err:=HttpGet(baseurl+publicPath)

?    if htmlData==""

?        err:=fmt.Errorf("HttpGet中有错啦,请检查HttpGet数据")

?        logger.Println(err)

?        return err

?    

?    if err!=nil

?        logger.Println(err)

?        return err

?    

?    file,err:=os.Create(basePath+publicPath)

?    defer file.Close()

?    if err!=nil

?        err:=fmt.Errorf("os.Open失败,err=%v",err)

?        logger.Println(err)

?        return err

?    

?    if file==nil

?        err:=fmt.Errorf("创建文件失败")

?        logger.Println(err)

?        return err

?    

?    file.WriteString(htmlData)

?    return nil



以上是关于golang 根据基础的url下载静态服务器上所有的文件的主要内容,如果未能解决你的问题,请参考以下文章

Golang实践录:静态资源文件整合:web服务

又是基础,获取后台传过来的file进行拼接url下载路径

如何使用 golang 下载包含所有文件和子目录的 HTTP 目录,因为它们出现在在线文件/文件夹列表中?

根据URL下载图片至客户端服务器实例

golang 使用go从URL下载资源。

在一个 IP 上托管多个 Golang 站点并根据域请求提供服务?