GB大文件快速下载,以及上传七牛

295 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)
}