已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 源码

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

作者: @Ta

时间: 2014-11-07

点击: 17917

个人认为浪人的那个小工具是通过 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|隐藏机器人聊天)』

1. http://ysbj.phpby.tk/ftp/
(/@Ta/2014-10-31 06:36//)

2. @读书顶个鸟用 能把源码发给我吗?
(/@Ta/2014-10-31 12:11//)

3. 是ftp_put,而且没啥技术含量
(/@Ta/2014-10-31 13:02//)

4. @net909,晚上吧
(/@Ta/2014-10-31 14:33//)

5. @浪人,所以共享吧~,另外 你那新版 上传路径定义了没效果,你检查下
(/@Ta/2014-10-31 15:37//)

6. @net909,你QQ多少,我QQ发给你
(/@Ta/2014-10-31 17:29//)

7. @读书顶个鸟用,我也写过,不过技术不好,只能传一个文件。{尴尬},能把你的源码发给我吗?
(/@Ta/2014-10-31 18:00//)

8. @小蒋同学,file_put我上传文件用循环只能传一个文件,技术不好{偷笑}。
(/@Ta/2014-10-31 18:02//)

9. @雨伤,我的也是只上传一个文件而已
(/@Ta/2014-10-31 18:22//)

10. @小蒋同学,(´_ゝ`)我有空放出来把。懒得整了。学业忙
(/@Ta/2014-10-31 18:46//)

11. @读书顶个鸟用,不会吧。{尴尬}
(/@Ta/2014-10-31 18:51//)

12. @雨伤,上传大量文件,不适合
(/@Ta/2014-10-31 18:53//)

13. @读书顶个鸟用,呃呃呃。好吧
(/@Ta/2014-10-31 19:00//)

14. @读书顶个鸟用@雨伤,文件上传太多容易超时,可以试试分批~
(/@Ta/2014-10-31 20:13//)

15. @小蒋同学,不会分唉!
(/@Ta/2014-10-31 20:22//)

16. @雨伤,加个判断就好了
(/@Ta/2014-10-31 21:22//)

17. @读书顶个鸟用,没明白啊,判断什么啊?具体点呗!
(/@Ta/2014-10-31 21:54//)

18. @雨伤
for($i=0; $i<100 $++){
    if($i>10){
        break;
    }
}
(/@Ta/2014-10-31 22:15//)

19. @读书顶个鸟用,好吧,这个和循环十次又有啥区别
(/@Ta/2014-10-31 22:25//)

下一页 1/2页,共33楼

回复需要登录

7月5日 10:00 星期六

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1