持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
需求说明
从第三方网站下载文件,然后上传到自已的七牛空间
这里下载使用shell脚本实现,上传使用Go项目实现
下载大文件
传统下载方式一般使用wget和curl下载然后保存在服务器上
#例1
curl -O https://github.com/xxx/xx/xxx.sh
#例2
wget -O xx2.sh https://github.com/xxx/xx/xxx.sh
以上命令可以实现下载功能,但是都是单线程,下载速度不快
这里推荐一个多线程下载工具: mwget
二进制下载
git clone https://github.com/rayylee/mwget.git
cd wget
./configure
make && make install
#或者直接下载编译好的发布版本: github.com/rayylee/mwg…
编译安装
#需要编译安装
wget http://jaist.dl.sourceforge.net/project/kmphpfm/mwget/0.1/mwget_0.1.0.orig.tar.bz2
tar -xjvf mwget_0.1.0.orig.tar.bz2
cd mwget_0.1.0.orig
./configure
make
make install
使用方式如下
查看帮助命令:
mwget -help
使用方式 默认使用4线程,可以指定参数 mwget -n 10 指定10个线程,下载飞起:
mwget github.com/xxx/xx/xxx.…
上传大文件
这里上传文件使用七牛的SDK,其实七牛还提供的了一些cli命令行工具,比如qshell,qrsctl等,但是上传速度也不太理想,最好使用SDK,上传也是飞起(SDK有一个开启CDN的功能)
以下是上传大文件的完整代码(ak和sk需要自填),打包成可执行文件后运行
因为使用了flag包,所以在运行时需要填入3个参数,这里没有做参数判断,看官们可以自行加if
package main
import (
"context"
"flag"
"fmt"
"os"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
)
//填入ak和sk
var (
accessKey = ""
secretKey = ""
)
func main() {
// 定义3个需要传入的参数
var localFile string
var key string
var bk string
flag.StringVar(&localFile, "f", "", "请输入本地文件的名称")
flag.StringVar(&key, "k", "", "请输入上传七牛的名称")
flag.StringVar(&bk, "b", "", "请输入bucket名称")
flag.Parse()
fmt.Println("localFile: ",localFile,"key: ",key)
bucket := bk
putPolicy := storage.PutPolicy{
Scope: bucket,
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)
cfg := storage.Config{}
// 空间对应的机房
cfg.Zone = &storage.ZoneHuadong
// 是否使用https域名
cfg.UseHTTPS = false
// 上传是否使用CDN上传加速
cfg.UseCdnDomains = true
resumeUploader := storage.NewResumeUploaderV2(&cfg)
ret := storage.PutRet{}
recorder, err := storage.NewFileRecorder(os.TempDir())
if err != nil {
fmt.Println(err)
return
}
putExtra := storage.RputV2Extra{
Recorder: recorder,
}
//上传文件
err = resumeUploader.PutFile(context.Background(), &ret, upToken, key, localFile, &putExtra)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(ret.Key, ret.Hash)
}