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

}

原文地址:https://www.cnblogs.com/MyUniverse/p/11470434.html

时间: 2024-10-08 14:51:11

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

往服务器上传指定文件

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream; import org.apache.commons.net.ftp.FTPClient;import org.apache.log4j.Logger; public c

对服务器上所有Word文件做全文检索的解决方案-Java

一.背景介绍    Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,目前这一问题没有好的解决方案,我个人能想到的解决方案是使用服务器端的Apache poi技术将所有文档的文本获取后存储到数据库,然后打开文档时利用sql语句检索文档是否包含关键字来判断是否是打开文档.但是这种解决办法有很大的弊端,首先poi技术对word文档支持不是很好,其中支持word的接口单一而且不太稳定,对word

定时登录下载sftp服务器上的某些有规则的文件

[[email protected] duizhangdan]# cat wget.sh #!/bin/bash#定时下载sina sftp服务器上的bak_dir=`date -d"5 day ago" +"%F"`tom_day=`date -d"5 day ago" +"%Y%m%d"`mkdir -p /data/duizhangdan/${bak_dir} sftp -oIdentityFile=/data/java

使用SAXReader读取ftp服务器上的xml文件(原创)

根据项目需求,需要监测ftp服务器上的文件变化情况,并将新添加的文件读入项目系统(不需要下载). spring配置定时任务就不多说了,需要注意的一点就是,现在的项目很多都是通过maven构建的,分好多子项目,通过pom互相依赖,定时任务的配置文件需要放到tomcat等容器发布的工程下,而不要放到任务所在的子项目里面,bean的class属性是可以通过项目依赖读取到其他子项目里面的class的,而且任务类需要有构造方法,涉及到spring架构的bean的知识,说的有点多了... =========

如何直接处理FTP服务器上的压缩文件?

我最近要写一个供有相关权限的管理人员查询大额资金明细的程序,界面如下: 所需的数据文件是放在报表服务器上,每天一个压缩文件,该压缩文件中除了所需的储蓄流水账文件外,还有很多其他的文件.如果先把该压缩文件从报表服务器下载到应用服务器上,再进行解压缩处理的话,一是多下载了该压缩文件中我们不需要的其他文件,二是还必须在应用服务器上建立以SessionID等方法标识的临时文件,以免其他用户也在进行查询时文件名冲突,三是使用完毕后还必须删除该临时文件. 我的处理方法是如下: using (ZipInput

java实现读取ftp服务器上的csv文件

定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPClient; /** * FTP服务器操作*/ public interface iFtpServU { public FTPClient ftp(String ip, String user, String password); public List<String[]> csv(InputStr

springmvc中Tomcat跨服务器上传中文名文件报错解决方案

今天花了一整天时间解决tomcat跨服务器上传文件失败的问题,经过各种搜索终于解决了,下面是解决具体方法: 一.首先修改Tomcat的只读属性为false. 在tomcat的conf目录下的web.xml文件中找到<servlet>标签,添加初始化参数readonly,代码如下: <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.se

服务器上用户访问文件权限设置

工作任务描述 HT公司准备搭建一台文件服务器.公司当前的情况是有销售,财务,信息三个部门.每个部门有几名员工,其中一名是其部门经理(详细用户请见上一项目). 要求: 1.在文件服务器上创建三个文件夹分别存放各部门的文件,并要求只有本部门的用户能访问其部门的文件夹(完全控制的权限),每个部门的经理和公司总经理可以访问所有文件夹(读取),另创建一个公共文件夹,使得所有用户都能在里面查看和存放公共的文件 2.每个部门的用户可以在服务器上存放最多100M的文件 3.公司服务器的硬盘空间有限,要求做好文件

上传文件到服务器上先创建文件夹

using System.IO; string directory = "UploadPhotos/"; //在服务器上创建上传图片存储的文件夹 if (!Directory.Exists(Server.MapPath(directory))) //判断存储图片的文件夹是否存在 { Directory.CreateDirectory(Server.MapPath(directory)); //如果不存在,创建它 }