问题描述
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 的人帮我解决了这个问题。