微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 sourceforge 下载等待和重定向

如何解决从 sourceforge 下载等待和重定向

我有一个如下所示的下载功能

func Download(url,dir string) error {
    resp,err := http.Get(url)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    filename := filepath.Base(url)
    filepath := path.Join(dir,filename)
    out,err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer out.Close()
    _,err = io.copy(out,resp.Body)
    return err
}

但是当我尝试从 Sourceforge 下载时我没有得到该文件,因为它有一个等待(倒计时)和一个重定向

url := https://prdownloads.sourceforge.net/expat/expat-2.2.10.tar.xz"
Download(url,".")

有没有办法以编程方式从 Sourceforge 下载?

解决方法

这似乎做到了:

package main

import (
   "net/http"
   "os"
   "path"
)

const (
s = "http://downloads.sourceforge.net/project/expat/expat/2.2.10/expat-2.2.10.tar.xz"
)

func main() {
   r,e := http.Get(s)
   if e != nil {
      panic(e)
   }
   defer r.Body.Close()
   f,e := os.Create(path.Base(s))
   if e != nil {
      panic(e)
   }
   defer f.Close()
   f.ReadFrom(r.Body)
}

但是,我发现 SourceForge 不太适合下载,这里有一个镜像:

https://github.com/libexpat/libexpat/releases

,

清除每个重定向的所有标头有效。将函数的第一行替换为:

client := &http.Client{}
client.CheckRedirect = func(req *http.Request,via []*http.Request) error {
    for k,_ := range req.Header {
        delete(req.Header,k)
    }
    return nil
}
req,err := http.NewRequest("GET",url,nil)
resp,err := client.Do(req)

测试:
https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-3.3.17.tar.xz
https://prdownloads.sourceforge.net/expat/expat-2.4.1.tar.xz

我遇到了同样的问题。 #go-nuts 的人帮我解决了这个问题。

另一种解决方案:https://play.golang.org/p/KuLr2c7beDA

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。