45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:如何使用PHP脚本下载远程文件?

如何使用PHP脚本下载远程文件?

2016-09-02 17:03:26 来源:www.45fan.com 【

如何使用PHP脚本下载远程文件?

使用PHP脚本来下载文件,无非是通过两种方式,一种是使用systemexec等即有的函数调用系统自带的下载工具,比如 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

 

本文地址:http://www.45fan.com/dnjc/71413.html
Tags: 远程 脚本 PHP
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部