设为首页 收藏本站
查看: 405|回复: 0

[经验分享] 使用PHP脚本下载远程文件

[复制链接]

尚未签到

发表于 2017-3-29 09:26:49 | 显示全部楼层 |阅读模式
  使用PHP脚本下载文件
  说明:纯属无聊,写着玩。
  使用PHP脚本来下载文件,无非是通过两种方式,一种是使用system、exec等即有的函数调用系统自带的下载工具,比如 wget 之类的来下载文件,还有一种是使用php本身利用Socket来下载文件,我选择第二种方式。
  使用Socket下载文件,首先如果是http协议的文件,必须明白HTTP协议的运行过程,如果是FTP协议的则要了解ftp协议运行过程,比较繁琐。比如HTTP协议访问一个文件的代码:(来自手册)

  <?php
$fp =fsockopen("www.example.com",80,$errno,$errstr,30);
if(!
$fp){
echo
"$errstr($errno)<br/>\n";
}else{
$out="GET/HTTP/1.1\r\n";
$out.="Host:www.example.com\r\n";
$out.="Connection:Close\r\n\r\n";

fwrite($fp,$out);
while(!
feof($fp)){
echo
fgets($fp,128);
}
fclose($fp);
}
?>

  我们为了简单起见,使用fopen直接访问远程文件来达到目的,同事又能够访问http,也能访问ftp,比较合适。当然,如果按照上面的思路来说,也可以使用ftp的函数库来实现。

  我们使用fopen函数来完成我们的工作,实现了如下代码:


#!/usr/bin/php
<?php
error_reporting
(0);
set_time_limit(0);

//无参数则给出提示
if($argc<2){
echo
"Usage:".$argv[0]."URL[Destination]\n\n";
exit();
}

//设置获取基本变量
$url=$argv[1];
$save_path=$argv[2]?$argv[2]:"./";
$file_name=array_pop(explode("/",$url));
$localfile=$save_path.$file_name;

//检查变量
if(!check_url($url)){
exit(
"Error:URL".$url."invalid.\n\n");
}
if(
file_exists($localfile)){
exit(
"Error:localfile".$localfile."exists.\n\n");
}

//打开远程文件
$fp=fopen($url,"rb");
if(!
$fp){
exit(
"Error:Download".$url."failed.\n\n");
}

//打开本地文件
$sp=fopen($localfile,"wb");
if(!
$sp){
exit(
"Error:Openlocalfile".$localfile."failed.\n\n");
}

//下载远程文件
echo"Downloading,pleasewaiting...\n\n";
while(!
feof($fp)){
$tmpfile.=fread($fp,1024);
}

//保存文件到本地
fwrite($sp,$tmpfile);
fclose($fp);
fclose($sp);
echo
"Downloadfile".$file_name."succeed!\n\n";

/*检查URL合法性函数 */
functioncheck_url($url){
return
preg_match("/^(http|ftp)(:\/\/)([a-zA-Z0-9-_]+[\.\/]+[\w\-_\/]+.*)+$/i",$url);
}

?>


  
我们把以上代码保存为 download.php 文件,在Linux/Unix下记得要加上可执行属性:
chmod +xdownload.php

另外,PHP脚本引擎的路径必须是 /usr/bin/php ,如果不是,请自行修改第一行为实际的PHP引擎路径,比如:
#! /usr/local/php/bin/php

使用上面的脚本来下载文件:
download.php 远程文件 保存路径

如把Google Talk程序下载到我们的 /tmp 目录下:
download.php http://dl.google.com/googletalk/googletalk-setup.exe /tmp/
  如果不出错,等待一会就能够在 /tmp/ 目录下看到 googletalk-setup.exe 文件。
  能够改进的就是支持更多协议、需要验证的能够输入用户名密码、有下载进度条。至于断点续传和多线程对于PHP来说还不太现实,有兴趣的可以自己加深一步。
  PS: 我另外发现一个更强的HTTP下载类,是dedeCMS的作者IT柏拉图写的,URL:
http://prato.bokele.com/?CH=749&ViewID=15272


  heiyeluren
2006-04-13

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356832-1-1.html 上篇帖子: php open_basedir的性能影响 下篇帖子: 回复《PHP的弱点,缺点是什么?》
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表