`

使用PHP脚本下载远程文件

 
阅读更多

使用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



分享到:
评论

相关推荐

    php远程文件管理器

    php脚本,远程文件管理器,可模拟shell,可修改文件权限

    php实现在线文件管理

    php实现在线文件管理,方便ftp空间管理,是文件一目了然

    Web应用安全:远程文件包含利用.pptx

    使用远程文件包含(RFI),攻击者可以使web应用程序包含远程文件。对于动态包含外部文件或脚本的web应用程序来说,这是可能的。成功的RFI攻击的潜在web安全后果包括从敏感信息泄露和跨站点脚本(XSS)到远程代码执行,...

    php脚本资料电子书籍

    PTNews远程管理脚本未授权访问缺陷 Session Tracking Part I Session Tracking Part 2 Ten Security Checks for PHP, Part 1 Ten Security Checks for PHP, Part 2 The Cross Site Scripting FAQ VBulletin 跨站...

    httpfs:通过服务器端脚本远程 FUSE 文件系统

    httpfs - 通过服务器端脚本远程 FUSE 文件系统 httpfs 是一个基于 FUSE 的文件系统,它使用 HTTP 消息在本地机器上挂载远程目录,依赖于安装在服务器上的生成的服务器端脚本(例如 PHP)。 设置 如准备环境段落中所...

    boyurl 远程执行shell脚本工具

    boyurl是一个通过PHP来远程执行shell脚本工具。整个程序只有两个文件,一个PHP文件,一个shell安装脚本,易于使用和安装。

    PHP-SSH-Sync:用于远程 phpssh 备份和复制的脚本

    PHP SSH 同步用于远程 php/ssh 备份和复制的脚本。要求SSH2 库见配置所有配置选项都在执行的 *.ini 文件中定义,可以制作许多配置文件。 有关更多信息,请参阅 sample-config.ini启动手动执行: $ php -f /PATH_TO/...

    tail.php:使用PHP脚本和telnet尾部(跟随)远程文件

    使用PHP脚本和telnet尾部(跟随)远程文件 $ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 您必须输入: GET /tail.php HTTP/1.1 Host: localhost 注意:请确保您...

    常用shell 脚本,dos攻击防范,

    批量主机远程执行命令脚本.sh 批量创建100用户并设置密码脚本.sh 批量检测网站是否异常脚本.sh 找出占用CPU 内存过高的进程脚本.sh 更多精品教程.url 服务器系统配置初始化脚本.sh 本教程由我爱学it提供.url ...

    PHP 获取远程文件内容的函数代码

    PHP 获取远程文件内容的代码,后面有一些注释可以参考下,其实大家可以参考脚本之家发布的一些采集程序代码。

    爱特文件管理器 1.8.0.zip

    *远程文件上传 *ZIP文件解压 *新建目录文件 *文本简洁编辑 *文件目录命名 *选中文件移动 *用户认证模块 *更多功能等你体验 作者说明: 作者QQ:759234755 作者网站:aite.me 作者邮箱:[email ...

    18个Linux Shell脚本经典案例视频.zip

    批量主机远程执行命令脚本 批量创建100用户并设置密码脚本 批量检测网站是否异常脚本 服务器系统配置初始化脚本 查看网卡实时流量脚本 监控100台服务器磁盘利用率脚本 监控MySQL主从同步状态是否异常脚本 目录文件...

    lift:用于与 FTP 服务器快速同步的 PHP 脚本

    Lift 可以通过保留远程文件状态的本地索引来加速您的“老派”项目部署。 当本地索引不可信时(远程文件通过其他方式更改,例如。)Lift 可以使用 PHP 脚本重新扫描远程服务器,具有很大的时间优势。 安装和配置 ...

    PHP 网络开发详解之远程文件包含漏洞

    由于PHP支持使用相同的函数(Function)对本地文件和远程文件进行操作。因此,一些恶意用户通过强行使网站上的PHP代码(Code)包含自己的文件来实现执行自己脚本的目的。

    Linux Shell脚本经典案例合集

    18个Linux Shell脚本经典案例合集,内含: Dos攻击防范(自动屏蔽攻击IP...批量主机远程执行命令脚本.sh 一键部署LNMP网站平台脚本.sh 一键查看服务器资源利用率.sh 自动发布Java项目(Tomcat).sh 自动发布PHP项目脚本.sh

    PHP实现打包zip并下载功能

    主要介绍了PHP实现打包zip并下载功能,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

    基于Vue和PHP的轻量级在线项目协作系统设计源码

    本资源提供了一套基于Vue和PHP的轻量级在线项目...这些文件详细展示了如何使用Vue、JavaScript、CSS和HTML构建一个轻量级的在线项目/任务协作系统,非常适合用于远程办公协作,非常适合学习和参考PHP和Vue项目的开发。

    mysql-sync:该脚本允许在远程服务器和本地服务器之间同步2个MySql数据库

    使用此脚本,可以在远程数据库和本地数据库之间来回复制数据库的结构和内容。 远程数据库通过SSH隧道访问。 该脚本以两种模式运行。 在第一个参数中传递模式-put:将本地数据库复制到远程服务器-get:将远程数据库...

    php_snippets:各种用途的小型独立 PHP 脚本的集合

    仅获取远程文件的标题并输出文件大小。 实际上,可以读取 HTTP 响应标头中的值,文件大小是一个有用的示例。 持久风格切换器 此脚本的目的是让您的网站使用多个 CSS 文件,让用户可以选择最适合他们的一个。 该脚本...

Global site tag (gtag.js) - Google Analytics