Perl HTTP 多线程下载合并之换行符错误
来源:互联网 发布:mac os 原版dmg镜像 编辑:程序博客网 时间:2024/05/16 12:21
写了一个小程序,用HTTP多线程下载并合并文件,核心下载代码如下:
my $ua = LWP::UserAgent->new;
my $head = HTTP::Request->new(GET => $url,
HTTP::Headers->new(
Range => "bytes=$start-$end"
#这个头用来标记部分下载开始结束位置
)
);
my $resp = $ua->request($head);
open FILE,">C:/tmp/txt_$partial.dat";
print FILE $resp->content;
close FILE;
合并代码如下:
open FILE,'>c:/tmp/final.txt';
for(1..n){
open TMP,"c:/tmp/txt_$_.dat";
$r = sysread TMP,$buf,1024*10;
while($r){
syswrite FILE,$buf,1024*10;
$r = sysread TMP,$buf,1024*10;
}
close TMP;
}
close FILE;
使用一个rar文件作为测试用途,结果发现合并后的代码无法打开,而且字节数有增加。换一个文本文件txt作测试,结果发现前后对比如下
前:
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflat
后:
Accept-Language: zh-cn^M
UA-CPU: x86^M
Accept-Encoding: gzip, deflate^M
可以明显看到,每一行的结束多了一个符号^M,这又是由于在不同系统中换行符的不同造成的。Windows编辑器产生换行回车两个符号/n/r,而unix下只有一个/n,经过socket中间的传输转化就会在不同的系统产生错误。
解决方法,在下载分割文件的时候,写入时使用syswrite写入分割块大小的数据,则产生的文件不会有错误。代码如下
my $ua = LWP::UserAgent->new;
my $head = HTTP::Request->new(GET => 'http://localhost/PerlCGI/key.txt',
HTTP::Headers->new(
Range => "bytes=$start-$end"
)
);
my $resp = $ua->request($head);
syswrite FILE,$resp->content,1024*1000;
close FILE;
每次都用一个小程序来扩充并测试一些功能,在此基础上解决发现的问题并继续完善发展自己的代码。
- Perl HTTP 多线程下载合并之换行符错误
- unity3d之http多线程异步资源下载
- http文件批量多线程下载之winform
- Unity3D之http多线程异步资源下载
- perl 处理 回车 换行符
- http多线程下载
- http多线程下载
- http:多线程下载器
- Http多线程下载
- HTTP多线程下载文件
- http协议多线程下载
- Http多线程下载
- java网络编程之Http多线程下载应用实例
- java网络编程之Http多线程下载应用实例
- Android之Http协议编程03-多线程下载
- [原]unity3d之http多线程异步资源下载
- Perl模块HTTP::Request安装错误
- java实现http多线程下载
- SqlServer,mysql,oracle 数据处理语句的区别
- 大公司是如何走上开放源码之路的
- 长春昨现史上最严重交通拥堵
- EL表达式不可用分析
- 台湾承认大陆41高校学历 有限制开放赴台就读
- Perl HTTP 多线程下载合并之换行符错误
- 开源NAS项目 - 五大免费
- 条款14:在资源管理类中小心coping行为(Think carefully about copying behavior in resource-managing classes.)
- 一个输入框,按回车自动提交表单
- 本命年纪事
- 63%的玩家用Firefox
- 使用struts1.2 标签 判断字符串长度,截取字符串。
- VC多线程临界区
- JS 文件大小判断的实现代码