[PHP]FTP快速上传源代码解析

@Ta 2014-11-07 3116点击
个人认为浪人的那个小工具是通过 ftp_put,上传文件到FTP。
推测实现流程:(压缩包->)解压->获取需要上传的所有文件的FTP绝对路径->通过 ftp_put 函数上传到远程连接的FTP上。

下面是 ftp_put 的使用方法:
<?php 
$ftp_server='localhost'; //FTP服务器地址
$ftp_user_name='lalalalala';//FTP用户名
$ftp_user_pass='abc';//FTP密码

// 定义变量
$local_file = '1.sql';
$server_file = '/public_html/1.bak';

// 连接FTP服务器
$conn_id = ftp_connect($ftp_server);
//验证登录服务器
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// 下载文件
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
echo "下载 $local_file 文件成功";
} else {
echo "下载失败";
}


$local_file = 'xr-register.zip';
$server_file = '/public_html/xr-register.up.zip';
if (ftp_put($conn_id, $server_file, $local_file, FTP_BINARY)) {
echo "上传 $server_file 文件成功";
} else {
echo "上传失败";
}

// 关闭ftp连接
ftp_close($conn_id);


?>


上面一段是从FTP下载到本地,另一段是从本地上传到FTP。

至于为什么不写出来~,表示有现成的再浪费时间写没意思,另外技术不够吧。
这个东西需要的时候很方便,不需要的时候一坨屎。


11.08-续帖:
已经实现多文件上传,修改部分代码。
<?php
// 设置报错内容等级
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 网页HEAD头function title($title){
echo <<<HTML
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
<title>{$title}-PHPBY</title>
<link rel="stylesheet" type="text/css" href="http://phpby.tk/style.css" />
</head>
<body>
HTML;
}

// 网页尾部
function footer($str=null){
if($str){
    echo '<div class="error">'.$str.'</div>';
}
echo <<<HTML
<div class="footer">&#169;2014 PHPBY All Rights Reserved.</div>
</body>
</html>
HTML;
}

function _decode($data) {
if($data!=null) {
$data=rawurldecode($data);
return $data;
} else {
return false;
}
}

//判断空间是否支持FTP函数
function_exists('ftp_connect') or exit(footer('空间不支持FTP相关函数!'));

    $host = $_POST['host'];
    $user = $_POST['user'];
    $pass = $_POST['pass'];
    $port = empty($_POST['port']) ? 21 : $_POST['port'];

if(!empty($host)){
    title('快捷安装脚本上传结果');
    echo '<div class="header">快捷安装脚本上传结果</div>';
    
    $path = $_POST['path']; // 远程路径
    //这里"fileadmin"就是匹配POST过来的zipfile,fileadmin.zip为与此文件同级目录下的压缩包,初次使用自动解压
    $zipfile_arr = array(
        'fileadmin' => 'fileadmin.zip',
        'installzip' => 'installzip.zip'
    );
    $zipfile = $zipfile_arr[$_POST['zipfile']] ? $zipfile_arr[$_POST['zipfile']] : exit(footer('没有找到此安装程序!'));

    if(!$conn = @ftp_connect($host,$port)){ //判断FTP主机是否连接成功
        echo '<div class="error">ERROR:&nbsp;无法连接FTP主机:'.$host.'</div>';
    }elseif(!@ftp_login($conn,$user,$pass)){ //判断FTP用户是否登陆成功
        echo '<div class="error">ERROR:&nbsp;无法登陆FTP主机:'.$user.'</div>';
    }else{
//判断是否存在解压记录
        
if(!is_file('./cache/'.$_POST['zipfile'].'/temp.cache')){
        //压缩文件
        $_path='./'.$zipfile;
        //解压目录
        $_dirpath='./cache/'.$_POST['zipfile'];
        //解压原始文件
        require 'pclzip.lib.php';
        $pk=new pclzip(_decode($_path));
        if(($count=$pk->extract(PCLZIP_OPT_PATH,$_dirpath))==false) {
        exit(footer('Hello,压缩包 '.basename(_decode($_path)).' 解压失败!'));
        }
        echo 'Hello,压缩包 '.basename(_decode($_path)).' 解压成功!';
        echo '<div class="big_board"><div class="board_title"></div></div>-&gt;&gt;Hello,共解出档案 '.count($count).' 个哦!';
        //print_r($count);
        @file_put_contents('./cache/'.$_POST['zipfile'].'/temp.cache',serialize($count));
}

        if(@ftp_mkdir($conn,$path)) echo '<div class="success">路径'.$path.'创建成功!</div>';//如果用户输入的目录不存在则尝试创建
        $handle = fopen('./cache/'.$_POST['zipfile'].'/temp.cache',"r");
        $count = unserialize(fread($handle, filesize ('./cache/'.$_POST['zipfile'].'/temp.cache')));
    foreach($count as $filename){
        $local = './cache/'.$_POST['zipfile'].'/'.$filename['stored_filename']; // 要上传的本地文件
        $sfile = $path.'/'.$filename['stored_filename'];
        
        // 判断是否为文件(要上传的本地文件是否存在)
        if(is_file($local)){
        
        // 上传文件
        if(@ftp_put($conn,$sfile,$local,FTP_BINARY)){
            echo '<div class="success">文件'.$filename['stored_filename'].'上传成功!</div>';
        }else{
            echo '<div class="error">文件'.$filename['stored_filename'].'上传失败!</div>';
        }
        }else{
        
        // 创建目录
        if(@ftp_mkdir($conn,$sfile)){
            echo '<div class="success">目录'.$filename['stored_filename'].'创建成功!</div>';
        }else{
            echo '<div class="error">目录'.$filename['stored_filename'].'创建失败!</div>';
        }
        }
      }
    }
}else{
    title('一键安装程序');
echo <<<HTML
<div class="lol">
    <div class="lo">一键安装程序</div>
    <form action="?" method="post" id="login" style="text-align:center;">
        FTP服务器

        <input type="text" name="host" value=""/><hr/>
        FTP端口

        <input type="text" name="port" value="21"/><hr/>
        FTP用户

        <input type="text" name="user" value=""/><hr/>
        FTP密码

        <input type="password" name="pass"/><hr/>
        远程路径

        <div class="nice">
            输入安装目录(可自动创建新目录)

        </div>
        <input type="text" name="path" value="/public_html/"/><hr/>
        安装程序

        <select name="zipfile">
            <option value="fileadmin">爱特文管(fileadmin)</option>
            <option value="installzip">一键安装(installzip.php)</option>
        </select>
        <input type="submit" value="一键上传"/>
    </form>
</div>
<div class="lol">
    <div class="lo">使用帮助</div>
    <font style="color:#90f;font-size:12px">
        远程路径中可以自动创建空目录,但是请注意,如果 /public_html/new/ 路径不存在,无法直接创建 /public_html/new/new/ 

        基于 @读书顶个鸟用 的单文件上传工具修改,版权归原作者。by 蒋小凌
    </font>
</div>
HTML;
}
footer();
?>


请尊重原作者意愿,修改版权除了让你更加自私没有其他的了。
另外 为了安全,程序请自建自用。别人提供的ftpup不能保证你的信息安全。因代码粗糙,提交错误的信息很可能出现错误。

*使用本段代码还需要文件pclzip.lib.php,并且创建一个文件夹名为cache
*所有压缩包均解压到cache目录中,为了安全,请在此目录创建.htaccess,写入Deny from All

最后上传工具源码包:
ftpup_byxiaoling.zip

(代码包传在第五页,我想有缘才tm看得到呀,防纯伸手党~)
回复列表(33)
添加新回复
回复需要登录

[聊天-聊天灌水] 方妹:Redmi K30 Pro