Golang 模拟客户端发送下载请求

本文介绍如何使用Golang来模拟浏览器发送下载请求,特别是在一个本地应用的需求中。代码基于beego框架,并且将文件的MD5值置于Header中。作者提供了相关工具函数,并欢迎读者提出改进意见和交流实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang 模拟客户端发送下载请求

最近遇到一个需求,需要本地应用模拟浏览器向服务器端发送下载请求。在google与百度上转了一大圈都没找到。于是自己写了一个,分享出来希望能帮到可以帮的人。程序是基于beego写的。文件的MD5是放在Header中的。当然你也可以根据自己的需求将其放在cookie中或是其他

下面上代码

type DownParameter struct {
    DownUrl  string
    Pid      string
    FileType string
    SavePath string
}

func Downloading(down *DownParameter) error {
    // 请求上端获取数据
    req := httplib.Post(down.DownUrl)
    req.Param("pid", down.Pid)
    req.Param("file_type", down.FileType)
    resp, err := req.Response()
    // 解析上端响应
    if err != nil {
        logs.Error("Request Downloading File Error : ", err.Error())
        return err
    }
    if resp.StatusCode != http.StatusOK {
        logs.Error("Request Downloading File Error : response code is ", resp.StatusCode)
        return errors.New(fmt.Sprintf("Request Downloading File Error : response code is %d", resp.StatusCode))
    }
    md5_code := resp.Header.Get("md5_code")
    _, err = os.Stat(common.GetDir(down.SavePath))
    if err != nil {
        if !os.IsNotExist(err) {
            logs.Error("Downloading Error : ", err.Error())
            return err
        }
        err = os.MkdirAll(common.GetDir(down.SavePath), os.ModePerm)
        if err != nil {
            logs.Error("Downloading Error : ", err.Error())
            return err
        }
    }
    // 解析上端响应保存到本地
    file, err := os.OpenFile(down.SavePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm)
    if err != nil {
        logs.Error("Downloading Error : ", err.Error())
        return err
    }
    _, err = io.Copy(file, resp.Body)
    defer resp.Body.Close()
    if err != nil {
        logs.Error("Downloading Error : ", err.Error())
        return err
    }
    // 获取下载文件的MD5校验码
    md5Value, err := common.GetFileMd5(file)
    if err != nil {
        return err
    }
    // 验证下载文件与上端服务器传送过来的MD5值是否一致
    if md5Value == md5_code {
        logs.Error("Downloading Error : Downloading file MD5 inspection failure")
        return errors.New("Downloading Error : Downloading file MD5 inspection failure")
    }
    return nil
}

以下是当中用到的工具函数

/**
功能:获取文件的MD5
*/
func GetFileMd5(file *os.File) (string, error) {
    md5 := md5.New()
    r := bufio.NewReader(file)
    _, err := io.Copy(md5, r)
    if err != nil {
        logs.Error("Calculate MD5 Error : ", err.Error())
        return "", err
    }
    return fmt.Sprintf("%X", md5.Sum(nil)), nil
}

// 获取文件夹路径
func GetDir(path string) string {
    len := strings.Count(path, "/")
    if len <= 1 {
        if len = strings.Count(path, "."); len <= 0 {
            return path
        } else {
            return ""
        }
    }
    index := strings.LastIndex(path, "/")
    dir := path[:index]
    fileName := path[index:]
    if do := strings.Count(fileName, "."); do <= 0 {
        return path
    }
    return dir
}

// 获取文件名
func GetFileName(path string) string {
    if len := strings.Count(path, "/"); len >= 1 {
        return path[strings.LastIndex(path, "/"):]
    }
    return path
}

如果各位在我的代码中看到有不妥的地方,欢迎指正。有更好的实现方式也可以与我一起交流,互相学习~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值