打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)

 

利用cURL实现单个文件分多段同时下载,支持断点续传(修订版) [复制链接]

摘自 http://bbs.chinaunix.net/thread-917952-1-1.html

在ubuntu下测试通过, 适合在支持多线程下载的站点下载文件
可以配合flashgot在firefox中使用

用法:./mycurl url [referedUrl]
第一个参数url是要下载的文件的地址,第二个参数referedUrl是指需要参照的网址(一般不需要,有些网站,比如华军需要此参数)
例如:
./mycurl ftp://xx.xxx.xxx/xxx.rar
或者
./mycurl http://xx.xxx.xx/xxx.rar http://www.xxx.xxx/yy.htm

下面是代码:

#!/bin/bash
####################################################################
#
# Script for curl to support resumable multi-part download.
#
# Tested on Ubuntu
#

url=$1

# How many "parts" will the target file be divided into?
declare -i parts=5

read -ep "Please input the target directory: " targetdir
read -ep "Please input the outfile name: " outfile

[ -z "$targetdir" ] && targetdir="./"
cd $targetdir||exit 2

[ -z "$outfile" ] && outfile=`basename $1`

#Set the referer url
if [ -n "$2" ]; then
    refurl="-L -e $2"
else refurl=""
fi

length=`curl $refurl -s -I $url|grep Content-Length|tail -n 1|sed s/[^0-9]//g`

if [ -z "$length" ]; then
        echo "cann‘t get the length of the target file"
        exit 1
fi
let "length = $length"

#lsession is used to record how many bytes of each subpart should be downloaded
declare -i lsession=$(($length/$parts))

finished="false"

#Assume the available maximum connections on server can reach "parts" at first
maxconn=$parts

while true;
do

for (( i=1; i<=parts ; i=i+1 ))
do

#Array offsetold is used to record how many bytes have been downloaded of each subpart

if [ -e $outfile$i ]; then
                offsetold[$i]=`ls -l $outfile$i|awk ‘{print $5}‘`
        else offsetold[$i]=0
        fi
        let "offsetold[$i] = ${offsetold[$i]}"

done

curr=0

for (( i=1; i<=parts && maxconn>0; i=i+1 ))
do

if [ $i -lt $parts ]; then
                if [ ${offsetold[$i]} -lt $lsession ]; then      
                        curl $refurl -r $(($curr+${offsetold[$i]}))-$(($curr+$lsession-1)) $url >> $outfile$i &
            maxconn=$(($maxconn-1))
                fi
        else
                if [ ${offsetold[$i]} -lt $(($length-$(($lsession*$(($parts-1)))))) ]; then
                        curl $refurl -r $(($curr+${offsetold[$i]}))- $url >> $outfile$i &
            maxconn=$(($maxconn-1))
                fi
        fi
              
        curr=$(($curr+$lsession))

done

#To wait for all curl processes to terminate.

wait

finished="true"
maxconn=0
for (( i=1; i<=parts; i=i+1 ))
do

#Array offsetnew is used to record how many bytes have been downloaded of each subpart

if [ -e $outfile$i ]; then
                offsetnew[$i]=`ls -l $outfile$i|awk ‘{print $5}‘`
        else offsetnew[$i]=0
        fi              
        let "offsetnew[$i] = ${offsetnew[$i]}"
        if [ $i -lt $parts ]; then
                if [ ${offsetnew[$i]} -lt $lsession ]; then
                        finished="false"
                fi
        else
                if [ ${offsetnew[$i]} -lt $(($length-$(($lsession*$(($parts-1)))))) ]; then
                        finished="false"
                fi
        fi

#Calculate the "real" available maximum connections supported by server

if [ ${offsetnew[$i]} -gt ${offsetold[$i]} ]; then
        maxconn=$(($maxconn+1))   
    fi
done

if [ "$finished" == "true" ]; then
                break
    elif [ $maxconn -eq 0 ]; then
        echo "Some errors may occur. retry 10 sec later..."
        sleep 10
        maxconn=parts
        fi
done

echo "All parts have been downloaded. Merging..."

mv --backup=t $outfile"1" $outfile
for (( i=2; i<=parts; i=i+1))
do
        cat $outfile$i >> $outfile
        rm $outfile$i
done

echo "Done."

[ 本帖最后由 ypxing 于 2007-4-4 21:45 编辑 ]

钢七连
不抛弃,不放弃
http://ypxing.cublog.cn/

linux dhcp peizhi roc  |  关于Unix文件的软链接  |  求教这个命令什么意思,我是新手,刚刚学习 ...  |  sed -e "/grep/d" 是什么意思?谢谢 ...  |  

   
   

家境小康

帖子
1597
主题
14
精华
0
可用积分
1679
信誉积分
100
专家积分
0
在线时间
56 小时
注册时间
2004-12-13
最后登录
2011-04-28
论坛徽章:
0
2

[报告]


发表于 2007-04-01 11:01:09
|只看该作者

支持一下,这个脚本实用价值很好(2004年到现在的第一帖……)。

提两个建议:
1. 接收curl的参数,这样才是一个完整的curl壳。
2. 等待本shell脚本所起的后台进程全部完成,用wait,既准确又简洁。
另外,随着您的shell功力提高,您可以自己尝试着修整该脚本,相信也会有所收获。

PS:有个真正的多线程(这个脚本是多进程下载)命令行下载工具axel,据说不错,但我没用过,可以一试。

SUN E4500/SUN F4800/SUN V880
Solaris 8
KSH/NAWK/SED/VIM 6.3.3/perl 5.005_03

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~

   

家境小康

帖子
1276
主题
40
精华
4
可用积分
1470
信誉积分
102
专家积分
130
在线时间
1 小时
注册时间
2004-11-19
最后登录
2012-06-22
论坛徽章:
0

3

[报告]


发表于 2007-04-01 11:21:53
|只看该作者

回复 2楼 一梦如是 的帖子

谢谢大侠指点, 学习中...
俺也去试试axel

钢七连
不抛弃,不放弃
http://ypxing.cublog.cn/

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~


大富大贵

帖子
3040
主题
480
精华
1
可用积分
17274
信誉积分
1220
专家积分
5
在线时间
2434 小时
注册时间
2005-08-30
最后登录
2016-06-13
论坛徽章:
84

4

[报告]


发表于 2007-04-01 11:23:22
|只看该作者

curl 没用过,不过这么好的想法,,顶一下!
慷慨陈词,岂能皆如人意,鞠躬尽瘁,但求无愧我心。
stay hungry, stay foolish
https://github.com/tcler
http://www.tldp.org/LDP/abs/html

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~

   

丰衣足食

帖子
8343
主题
245
精华
1
可用积分
726
信誉积分
195
专家积分
15
在线时间
411 小时
注册时间
2006-09-18
最后登录
2013-08-16
论坛徽章:
0

5

[报告]


发表于 2007-04-01 14:21:48
|只看该作者

哇,支持!

爱家、爱国、爱和平、爱自由、爱生活、爱大自然!

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~


丰衣足食

帖子
154
主题
17
精华
0
可用积分
748
信誉积分
238
专家积分
0
在线时间
76 小时
注册时间
2005-04-01
最后登录
2016-06-06
论坛徽章:
0
6

[报告]


发表于 2007-04-01 19:28:31
|只看该作者

顶,佩服+羡慕楼主

我的习惯是下大文件用wget,小文件直接用firefox的下载器,有的站点单线程不快的话,就无能为力了

   

家境小康

帖子
1276
主题
40
精华
4
可用积分
1470
信誉积分
102
专家积分
130
在线时间
1 小时
注册时间
2004-11-19
最后登录
2012-06-22
论坛徽章:
0

7

[报告]


发表于 2007-04-01 21:50:06
|只看该作者

一开始写这个script是为了和flashgot配合,在firefox里使用来者,呵呵
我也经常用wget的

原帖由 mmx384 于 2007-4-1 19:28 发表
顶,佩服+羡慕楼主

我的习惯是下大文件用wget,小文件直接用firefox的下载器,有的站点单线程不快的话,就无能为力了

钢七连
不抛弃,不放弃
http://ypxing.cublog.cn/

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~


家境小康

帖子
792
主题
43
精华
0
可用积分
1714
信誉积分
172
专家积分
0
在线时间
101 小时
注册时间
2004-03-14
最后登录
2013-09-28
论坛徽章:
0
8

[报告]


发表于 2007-04-01 23:38:42
|只看该作者

http://pycurl.sourceforge.net/
ASUSW3Z-W3HT30; DELL Lattitude D630; ThinkPadX61 7675C ; DELL OPTIPLEX-755

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~

   

家境小康

帖子
1276
主题
40
精华
4
可用积分
1470
信誉积分
102
专家积分
130
在线时间
1 小时
注册时间
2004-11-19
最后登录
2012-06-22
论坛徽章:
0

9

[报告]


发表于 2007-04-02 11:09:10
|只看该作者

谢谢
用他们提供的库可以开发更友好,功能更复杂的东东,有时间要试一下的

原帖由 baif 于 2007-4-1 23:38 发表
http://pycurl.sourceforge.net/

钢七连
不抛弃,不放弃
http://ypxing.cublog.cn/

编译器和语言的恩怨情仇| 【有奖讨论】DOCKER进化带来的讨论! | 【有奖调研】中小企业云服务选型 | 华为ICT巡展,跨越350个城市来见你~


家境小康

帖子
1276
主题
40
精华
4
可用积分
1470
信誉积分
102
专家积分
130
在线时间
1 小时
注册时间
2004-11-19
最后登录
2012-06-22
论坛徽章:
0
10

[报告]


发表于 2007-04-03 21:28:23
|只看该作者

修改了一下原来的脚本
1. 用wait等待后台进程的完成
2. 避免了对不支持多线程下载的站点多次重复连接

通过修改写过的脚本确实可以学到更多东西

原帖由 一梦如是 于 2007-4-1 11:01 发表
支持一下,这个脚本实用价值很好(2004年到现在的第一帖……)。

提两个建议:
1. 接收curl的参数,这样才是一个完整的curl壳。
2. 等待本shell脚本所起的后台进程全部完成,用wait,既准确又简洁。
另外, ...

钢七连
不抛弃,不放弃
http://ypxing.cublog.cn/
时间: 2024-12-15 01:48:02

打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)的相关文章

【FTP】FTP文件上传下载-支持断点续传

Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常用)]和[ASCII_FILE_TYPE]两种; 数据连接模式:一般使用LocalPassiveMode模式,因为大部分客户端都在防火墙后面: 1. LocalPassiveMode:服务器端打开数据端口,进行数据传输: 2. LocalActiveMode:客户端打开数据端口,进行数据传输: 系统

google obb(三)从自己cdn上下载(支持断点续传)

支持断点续传 参考网址 https://www.twblogs.net/a/5b8b35ad2b717718832e0bb6/zh-cn https://blog.csdn.net/AnYuanLzh/article/details/70848442 当然还需要判断 网络是否连接.当前非wifi提示是否手机下载.obb下载完毕校验obb是否正确 你可能还需要了解: 修改Unity导出Android工程启动时黑屏,启动时间过长 原文地址:https://www.cnblogs.com/wangle

苹果电脑利用curl下载数据集

在看tensorflow书上迁徙学习的这一部分的时候,书上说利用 curl http://download.tensorflow.org/example_images/flower_photos.tgz 下载数据集的时候,照着书上的指令在终端上做,结果出现的是一堆乱码,一直在屏幕上开始跑,刚开始以为是正在进行下载数据什么的,跑了几次都是同一种情况,最终按回车键会显示错误. 通过查阅资料后发现,curl直接跟网址的时候,其会直接在终端屏幕上显示,所以说显示出来的是乱码,为了将数据集下载到具体的文件

cesium结合geoserver利用WFS服务实现图层编辑(附源码下载)

前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内容概览 1.cesium结合geoserver利用WFS服务实现图层编辑功能2.源代码demo下载 效果图如下: 本篇主要是在上一篇cesium结合geoserver利用WFS服务实现图层新增(附源码下载)基础上实现的,cesium通过调用geoserver发布的地图服务WFS来达到图层编辑记录的目

Pacman主题下给Hexo增加简历类型

原文 http://blog.13kbook.com/2015/01/02/add-resume-type-to-hexo-under-pacman-theme/ 背景 虽然暂时不找工作,但是想着简历也是个向别人推销自己的好东西.然后也想着折腾点新的东西,如此,这般,便想着研究起写个简历了. 形式不限,但是必须是在线的,最好是很简洁的. 分析 既然是在线的,那就干脆直接用博客呗,直接放在上面. 写博客既然用Markdown,那简历也直接用Markdown,一个是可以在线渲染,另外一个是生成PDF

Ubuntu下Mac主题的安装与配置(上篇)

1.安装gnome经典桌面 sudo apt-get install gnome-session-fallback 没有安装桌面的可安装 gnome 桌面: sudo apt-get install gnome-core 2.下载安装http://sourceforge.net/projects/macbuntu/ ,macbuntu 主题是高仿的(90%)!同样适用 10.10 以后的版本,但要简单设置一下:将 install.sh 和 uninstall.sh 中的UBUVER="10.10

java语言打印上三角和下三角,进一步得到九九乘法表

关于下面两种图形的打印问题 ***** 与 * ****  ** *** *** ** **** *  ***** 一:程序 1.先打印下三角 2.结果 3.后打印上三角 4.结果 二:知识点 1.for的双循环 2.规律 尖朝上,可以改变条件.让条件随着外循环变化. 尖朝下,可以初始化值,让初始化随着外循环变化. 三:运用(九九乘法表) 1.程序 2.结果

Java: 在不同windows主题下,JFrame窗口设置最佳高度的解决方案

//设置窗口的大小,无论使用怎样的windows主题,都能灵活的应对,显示合适的窗口大小,一定要在JFrame.setVisible(true)之前调用, //替代传统的frame.setSize(width,height); public static void setSize(JFrame frame, int width, int height) { //一定要在JFrame显示之前调用 frame.pack(); //在默认的setResizable(true); 情况下,titleDe

数据仓库专题(6)-数据仓库、主题域、主题概念与定义

一.数据仓库 关于数据仓库概念的标准定义业内认可度比较高的,是由数据仓库之父比尔·恩门(Bill Inmon)在1991年出版的"Building the Data Warehouse"(<建立数据仓库>)一书中所提出: 中文定义:数据仓库是一个面向主题的.集成的.相对稳定的.反映历史变化的数据集合,用于支持管理决策. 英文定义:A data warehouse is a subject-oriented, integrated, nonvolatile, and time