使用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: local file ". $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: Open local file ". $localfile ." failed./n/n");
}

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

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

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

?> 


--------------------------------------------------------------------------------


 我们把以上代码保存为 download.php 文件,在Linux/Unix下记得要加上可执行属性:
chmod +x download.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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/heiyeshuwu/archive/2006/04/13/661618.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
windows下使用PHP实现定时执行脚本 一直以来,使用PHP定时运行脚本都是让大家头痛的问题,但是我们确实可以利用windows的计划任务来定时调用PHP脚本,当然这还要感谢PHP.exe。下面,站长将向大家介绍,如何来实现。 目标:根据系统时间定时执行PHP脚本,不需要人工运行(这里以定时新建一个文本文件并写入内容为例) 解决步骤: 1、建立PHP脚本,如下: 大家,可以看见,我们在这里对将要创建的文件路径使用了绝对路径,这是因为我们将要通过windows命令行来调用此脚本,由于cmd.exe与我们的web根目录是不一样的,而php文件目录函数只能在web根目录范围内进行操作,所以我们需要使用绝对路径,否则代码将正确执行但是文件将不会被创建。 2、新建.bat文件,代码如下: "D:\Program Files (x86)\Web\PHP\php.exe" -f "D:\Program Files (x86)\Web\www\root\go.php" 保存,并命名为run.bat。 注意,如果你的PHP目录或web根目录中含有空格,你需要使用引号将整个路径引用起来,否则将运行错误。站长的目录中含有空格,因此使用了引号。创建属于你自己的bat文件时,请根据自身情况决定是否要使用引号和文件的目录。 3、添加windows计划任务 从控制面板中打开计划任务(这里主要针对win7用户进行说明),点击“创建基本任务”,填写名称和描述,然后点击“下一步”,选择任务执行的频率,很好理解,然后点击“下一步”,设置任务的执行时间,然后点击“下一步”,选择“启动程序”,点击“下一步”,点击浏览按钮选择我们建立的“run.bat”文件,点击”下一步“,点击”完成“。 4、运行 根据你设置的时间,系统会定时自动运行,如果你等不及也可以手动执行。在”计划任务“中间栏下方的任务名中查找你刚才新建的任务,鼠标双击该任务,单击右边的运行按钮,系统会弹出一个cmd对话框然后关闭,这说明你的脚本已经正确执行了,到创建文件的目录去检查文件是否创建。 好了,在windows下使用PHP实现计划任务就介绍到这里了,希望对大家有帮助。 (责任编辑:麦田守望者)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值