我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方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 1355049422@qq.com
*/
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]) && !@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上传文件到自己的服务器,如有不对的地方还请大家指正。

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

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

    C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...

  2. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  3. Linux通过FTP上传文件到服务器

    1.如果没有安装ftp,可执行: 输入:yum -y install ftp,回车 等待安装完毕 2.连接服务器 输入:ftp 服务器IP,回车 根据提示输入用户名和密码 3.上传下载操作 1). 上 ...

  4. ftp上传文件,本地安装了,服务器上也需要在也安装一个ftp

    服务器需要配置FTP服务: 你说的在你自己电脑上安装的只是一个FTP软件,用于连接远程服务器进行上传和下载文件的. 追问 在本地已经安装了,链接的话要在服务器上也安装一个吗? 追答 额,你有FTP服务 ...

  5. C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误

    FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...

  6. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

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

    今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...

  8. FTP 上传文件

    有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...

  9. Java ftp 上传文件和下载文件

    今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...

随机推荐

  1. PHP composer 日常使用命令和理解

    composer的操作很多很杂,平时大都用不上,正要找又一时半会难找到 日常操作,走起 第一部分 : 安装 composer.json composer init 这个命令创建了一个 composer ...

  2. java基础第五篇封装与面向对象

    a.方法: public static void main(String[] args) { } 一般定义标准: 形参:一般把 不确定的量或者变化的量定义在形参位置//圆的的半径,长方形的长和宽,传递 ...

  3. 双系统更新ubuntu后,启动引导项消失,无法进入windows

    1.打开终端输入命令sudo gedit /etc/default/grub 2.修改GRUB_TIMEOUT="10" 3.输入sudo update-grub( update ...

  4. CF914D Bash and a Tough Math Puzzle 线段树+gcd??奇怪而精妙

    嗯~~,好题... 用线段树维护区间gcd,按如下法则递归:(记题目中猜测的那个数为x,改动次数为tot) 1.若子区间的gcd是x的倍数,不递归: 2.若子区间的gcd是x的倍数,且没有递归到叶子结 ...

  5. CodeForces - 608A-Saitama Destroys Hotel(模拟)

    Saitama accidentally destroyed a hotel again. To repay the hotel company, Genos has volunteered to o ...

  6. HttpEnum

    package com.yd.ifm.client.caller.util.http; public class HttpEnum { public enum DefContentTypeEnum i ...

  7. [PHP] – 性能优化 – Fcgi进程及PHP解析优化

    https://www.abcdocker.com/abcdocker/808------[PHP] – 性能优化 – Fcgi进程及PHP解析优化

  8. 跟老男孩学Linx运维---web集群实战笔记

    2018/01/05 2018/01/04 安装:PHP扩展插件PDO_MYSQL-1.0.2报错 In file included from /home/wasadmin/PDO_MYSQL-1.0 ...

  9. 项目协作管理平台-teambition和tapd--深度体验

    ​ 一.分析目的 通过分析2B产品中的团队协作管理软件的对比分析,用于为公司团队协作软件的选型做产考. 二.竞品归属市场概况 2.1.目标用户群及需求 主要面向企业用户,用于解决企业不同地域以及不同职 ...

  10. Uncaught Error: Bootstrap's JavaScript requires jQuery

    在写bootstarp的时候,一直报 Uncaught Error: Bootstrap's JavaScript requires jQuery 查看了自己引入的文件路径是对的,也可以使用jquer ...