PHP使用FTP上传文件到服务器(实战篇)

我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方sdk上传文件,但是文件在第三方服务器上。现在我们使用PHP的ftp功能把文件上传到我们自己的服务器,我使用的linux的服务器,首先确保服务器上配置好ftp,以vsftpd为例。

FTP类,此类包含把文件上传、下载、删除和删除ftp服务器目录功能,php版本>=7.0

<?php
/**
 * Created by PhpStorm.
 * User: 123456
 * Date: 2018/9/20
 * Time: 11:15
 * @author sunjiaqiang
 * @email [email protected]
 */
    class Ftp{
        private $host=‘‘;//远程服务器地址
        private $user=‘‘;//ftp用户名
        private $pass=‘‘;//ftp密码
        private $port=21;//ftp登录端口
        private $error=‘‘;//最后失败时的错误信息
        protected $conn;//ftp登录资源

        /**
         * 可以在实例化类的时候配置数据,也可以在下面的connect方法中配置数据
         * Ftp constructor.
         * @param array $config
         */
        public function __construct(array $config=[])
        {
            empty($config) OR $this->initialize($config);
        }

        /**
         * 初始化数据
         * @param array $config 配置文件数组
         */
        public function initialize(array $config=[]){
            $this->host = $config[‘host‘];
            $this->user = $config[‘user‘];
            $this->pass = $config[‘pass‘];
            $this->port = isset($config[‘port‘]) ?: 21;
        }

        /**
         * 连接及登录ftp
         * @param array $config 配置文件数组
         * @return bool
         */
        public function connect(array $config=[]){
            empty($config) OR $this->initialize($config);
            if (FALSE == ($this->conn = @ftp_connect($this->host))){
                $this->error = "主机连接失败";
                return FALSE;
            }
            if ( ! $this->_login()){
                $this->error = "服务器登录失败";
                return FALSE;
            }
            return TRUE;
        }

        /**
         * 上传文件到ftp服务器
         * @param string $local_file 本地文件路径
         * @param string $remote_file 服务器文件地址
         * @param bool $permissions 文件夹权限
         * @param string $mode 上传模式(ascii和binary其中之一)
         */
        public function upload($local_file=‘‘,$remote_file=‘‘,$mode=‘auto‘,$permissions=NULL){
            if ( ! file_exists($local_file)){
                $this->error = "本地文件不存在";
                return FALSE;
            }
            if ($mode == ‘auto‘){
                $ext = $this->_get_ext($local_file);
                $mode = $this->_set_type($ext);
            }
            //创建文件夹
            $this->_create_remote_dir($remote_file);
            $mode = ($mode == ‘ascii‘) ? FTP_ASCII : FTP_BINARY;
            $result = @ftp_put($this->conn,$remote_file,$local_file,$mode);//同步上传
            if ($result === FALSE){
                $this->error = "文件上传失败";
                return FALSE;
            }
            return TRUE;
        }

        /**
         * 从ftp服务器下载文件到本地
         * @param string $local_file 本地文件地址
         * @param string $remote_file 远程文件地址
         * @param string $mode 上传模式(ascii和binary其中之一)
         */
        public function download($local_file=‘‘,$remote_file=‘‘,$mode=‘auto‘){
            if ($mode == ‘auto‘){
                $ext = $this->_get_ext($remote_file);
                $mode = $this->_set_type($ext);
            }
            $mode = ($mode == ‘ascii‘) ? FTP_ASCII : FTP_BINARY;
            $result = @ftp_get($this->conn, $local_file, $remote_file, $mode);
            if ($result === FALSE){
                return FALSE;
            }
            return TRUE;
        }

        /**
         * 删除ftp服务器端文件
         * @param string $remote_file 文件地址
         */
        public function delete_file(string $remote_file=‘‘){
            $result = @ftp_delete($this->conn,$remote_file);
            if ($result === FALSE){
                return FALSE;
            }
            return TRUE;
        }
        /**
         * ftp创建多级目录
         * @param string $remote_file 要上传的远程图片地址
         */
        private function _create_remote_dir($remote_file=‘‘,$permissions=NULL){
            $remote_dir = dirname($remote_file);
            $path_arr = explode(‘/‘,$remote_dir); // 取目录数组
            //$file_name = array_pop($path_arr); // 弹出文件名
            $path_div = count($path_arr); // 取层数
            foreach($path_arr as $val) // 创建目录
            {
                if(@ftp_chdir($this->conn,$val) == FALSE)
                {
                    $tmp = @ftp_mkdir($this->conn,$val);//此处创建目录时不用使用绝对路径(不要使用:2018-02-20/ceshi/ceshi2,这种路径),因为下面ftp_chdir已经已经把目录切换成当前目录
                    if($tmp == FALSE)
                    {
                        echo "目录创建失败,请检查权限及路径是否正确!";
                        exit;
                    }
                    if ($permissions !== NULL){
                        //修改目录权限
                        $this->_chmod($val,$permissions);
                    }
                    @ftp_chdir($this->conn,$val);
                }
            }

            for($i=0;$i<$path_div;$i++) // 回退到根,因为上面的目录切换导致当前目录不在根目录
            {
                @ftp_cdup($this->conn);
            }
        }

        /**
         * 递归删除ftp端目录
         * @param string $remote_dir ftp目录地址
         */
        public function delete_dir(string $remote_dir=‘‘){
            $list = $this->list_file($remote_dir);
            if ( ! empty($list)){
                $count = count($list);
                for ($i=0;$i<$count;$i++){
                    if ( ! preg_match(‘#\.#‘,$list[$i]) && [email protected]ftp_delete($this->conn,$list[$i])){
                        //这是一个目录,递归删除
                        $this->delete_dir($list[$i]);
                    }else{
                        $this->delete_file($list[$i]);
                    }
                }
            }
            if (@ftp_rmdir($this->conn,$remote_dir) === FALSE){
                return FALSE;
            }
            return TRUE;
        }

        /**
         * 更改 FTP 服务器上的文件或目录名
         * @param string $old_file 旧文件/文件夹名
         * @param string $new_file 新文件/文件夹名
         */
        public function remane(string $old_file=‘‘,string $new_file=‘‘){
            $result = @ftp_rename($this->conn,$old_file,$new_file);
            if ($result === FALSE){
                $this->error = "移动失败";
                return FALSE;
            }
            return TRUE;
        }

        /**
         * 列出ftp指定目录
         * @param string $remote_path
         */
        public function list_file(string $remote_path=‘‘){
            $contents = @ftp_nlist($this->conn, $remote_path);
            return $contents;
        }

        /**
         * 获取文件的后缀名
         * @param string $local_file
         */
        private function _get_ext($local_file=‘‘){
            return (($dot = strrpos($local_file,‘.‘))==FALSE) ? ‘txt‘ : substr($local_file,$dot+1);
        }

        /**
         * 根据文件后缀获取上传编码
         * @param string $ext
         */
        private function _set_type($ext=‘‘){
            //如果传输的文件是文本文件,可以使用ASCII模式,如果不是文本文件,最好使用BINARY模式传输。
            return in_array($ext, [‘txt‘, ‘text‘, ‘php‘, ‘phps‘, ‘php4‘, ‘js‘, ‘css‘, ‘htm‘, ‘html‘, ‘phtml‘, ‘shtml‘, ‘log‘, ‘xml‘], TRUE) ? ‘ascii‘ : ‘binary‘;
        }

        /**
         * 修改目录权限
         * @param $path 目录路径
         * @param int $mode 权限值
         */
        private function _chmod($path,$mode=0755){
            if (FALSE == @ftp_chmod($this->conn,$path,$mode)){
                return FALSE;
            }
            return TRUE;
        }

        /**
         * 登录Ftp服务器
         */
        private function _login(){
            return @ftp_login($this->conn,$this->user,$this->pass);
        }

        /**
         * 获取上传错误信息
         */
        public function get_error_msg(){
            return $this->error;
        }
/**
 * 关闭ftp连接
 * @return bool
 */
public function close(){
    return $this->conn ? @ftp_close($this->conn_id) : FALSE;
}
    }

使用方法,包含文件上传、下载、删除、移动以及删除整个文件夹

<?php
/**
 * Created by PhpStorm.
 * User: 123456
 * Date: 2018/9/20
 * Time: 14:07
 */
declare(strict_types=1);
include ‘Ftp.php‘;
$config = [
    ‘host‘=>‘192.168.0.148‘,
    ‘user‘=>‘ftpuser‘,
    ‘pass‘=>‘123456‘
];
$ftp = new Ftp($config);
$result = $ftp->connect();
if ( ! $result){
    echo $ftp->get_error_msg();
}

$local_file = ‘video3.mp4‘;
$remote_file = date(‘Y-m‘).‘/video3.mp4‘;

//上传文件
if ($ftp->upload($local_file,$remote_file)){
    echo "上传成功";
}else{
    echo "上传失败";
}
//删除文件
if ($ftp->delete_file($remote_file)){
    echo "删除成功";
}else{
    echo "删除失败";
}

//删除整个目录
$remote_path=‘2018-09-19‘;
if ($ftp->delete_dir($remote_path)){
    echo "目录删除成功";
}else{
    echo "目录删除失败";
}

//下载文件
$local_file2 = ‘video5.mp4‘;
$remote_file2=‘video3.mp4‘;
if ($ftp->download($local_file2,$remote_file2)){
    echo "下载成功";
}else{
    echo "下载失败";
}

//移动文件|重命名文件
$local_file3 = ‘video3.mp4‘;
$remote_file3=‘shangchuan3/video3.mp4‘;
if ($ftp->remane($local_file3,$remote_file3)){
    echo "移动成功";
}else{
    echo "移动失败";
}
$ftp->close();
//p($result);

function p($data=‘‘){
    echo ‘<pre>‘;
    print_r($data);
    echo ‘</pre>‘;
}

以上就是php使用ftp上传文件到自己的服务器,如有不对的地方还请大家指正。

原文地址:https://www.cnblogs.com/phproom/p/9683612.html

时间: 2024-10-13 10:17:35

PHP使用FTP上传文件到服务器(实战篇)的相关文章

C# FTP上传文件至服务器代码

C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo">需要上传的文件</param> /// <param name="targetDir">目标路径</param> /// <param name="hostname">ftp地址</param&g

使用FTP上传文件到服务器

最近做项目遇到一个功能,需要将文件上传到服务器上面,在网上看到有很多解决方案,最常用的是FTP.Socket和WebClient,这里写的基于FTP上传的. public class FTPClass { /// <summary> /// FTP /// </summary> /// <param name="Server">服务</param> /// <param name="Port">端口<

再看ftp上传文件

前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在本地测试程序上传到ftp服务器一点问题都没有,奇怪的是当发布Web和ftp到同一个IIS下,上传文件时程序直接卡死,然后页面卡死,后来我又发现把Web和ftp分开发布在两台机器上问题又得到解决,所以当时放弃了这个方案. 再看ftp上传文件 前几天偶然看到Wolfy写到一个项目总结,其中提到了用Ser

C++实现向FTP上传文件

连接 CInternetSession *m_pInetsession; CFtpConnection *m_pFtpConnection; m_pInetsession=new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS); try { m_pFtpConnection=m_pInetsession->GetFtpConnection("127.0.0.1",NULL,NULL,38); Messa

Java ftp 上传文件和下载文件

今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接:http://blog.csdn.net/yucaifu1989/article/details/51483118 为了方便大家对比,我吧文章代码偷了过来: import java.io.File; import java.io.FileInputStream; import java.io.Fil

FTP上传文件提示550错误原因分析。

今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文件不可用(例如,未找到文件, 百度查找原因: 1.说文件权限: 2.路径是否正确: 3.路径是不是要加“@” 还有其他各类说法,逐一检查未发现错误,关键是同一个文件同样代码,一个程序可以正确完成上传,一个跳异常. 后来突然想到拷贝代码时FTP类提示using System.Linq;命名空间错误.

本地虚拟机中匿名ftp上传文件失败的问题

在10.10.50.230中新建了一个匿名的ftp服务器,结果在10.10.50.241中上传文件时提示: local: README.txt remote: /var/ftp/pub/upload 227 Entering Passive Mode (10,10,50,230,117,8). 553 Could not create file.   由于搭建步骤是完全按照标准文档建立的,vsftp.conf的设置应该没有问题,检查:getsebool -a|grep ftp 发现: allow

FTP上传文件速度太慢怎么办?

用户在建设网站时必不可少的一类工具就是文件传输工具.通过客户端和主机之间的文件交互,及时上传补丁文件.下载日志文件等,确保网站的正常稳定运行.但是也有不少用户反映使用FTP上传文件速度太慢,这是什么原因呢?FTP上传文件速度太慢怎么办?一.为什么FTP上传文件速度太慢? 运维人员在日常的工作中会使用FTP软件上传补丁.升级包.下载数据.日志等数据.FTP上传与下载速度慢,严重的影响运维人员的工作效率,与此同时一味的指责网络提供商,其实有些以偏概全. 为什么FTP上传文件速度太慢呢? FTP协议自

Windows文件传输篇:怎么上传文件到服务器?

很多时候,我们需要把文件传输到服务器上进行运行.部署等操作,在使用windows服务器的时候,我们都会遇到这样的问题:我们应该怎么上传文件到服务器?有没有简单的方法来实现本地文件上传到服务器呢? Windows文件传输方法之一: 将需上传的文件打包压缩,利用邮箱附件功能发到另一邮箱,随后在服务器上登录邮箱下载. Windows文件传输方法之二: 将数据上传至百度网盘或者微云等第三方存储服务,在服务器上登录即可下载. Windows文件传输方法之三: 远程登录服务器时,通过本地磁盘映射功能,将本地