我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方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. SpringMVC之一个简单的例子

    一.一个简单的例子 二.web.xml文件配置 三.spring-mvc.xml文件(等同于struts2的struts文件) 四.login.jsp(登录页面) 五.登录成功的页面(success. ...

  2. Go 基础(非常基础)

    // package main 和 main 函数 package main func main() {} //每一个.go文件都需要有 package 关键词,并且声明在文件顶部 package p ...

  3. css布局全总结

    一  居 中 布 局 水平居中 1. 使用inline-block+text-align(1)原理.用法 原理:先将子框由块级元素改变为行内块元素,再通过设置行内块元素居中以达到水平居中. 用法:对子 ...

  4. easyui---tabs(选项卡)

    配置好easyui环境 1.笔记: tabs(选项卡) class:class="easyui-tabs" //<div class="easyui-tabs&qu ...

  5. [bzoj 1758] 重建计划

    bzoj 1758 重建计划 题意: 给定一棵有边权的树和两个数 \(L, R (L\leq R)\),求一条简单路径,使得这条路径经过的边数在 \(L, R\) 之间且路径经过的边的边权的平均值最大 ...

  6. BZOJ1057(单调栈 or 悬线法)

    方法一 黑白棋盘拥有性质:(r + c) % 2的值决定颜色 因此把某色全部反转,直接求另一色的最大矩形即可,单调栈的经典问题 #include <cstdio> #include < ...

  7. Linux 运维培训笔记

    2018/01/05 权限管理:sudoers文件 KAIFA_ADMINS           ALL=(OP1)            KAIFACMD 用户(大写)                ...

  8. AngularJS(一):概述

    本文也同步发表在我的公众号“我的天空” 在我们之前学习的前端代码编写过程中,总是通过HTML与CSS来进行页面布局,而使用JS来控制页面逻辑,因此,我们习惯于在JS中来操作页面元素,如以下代码,我们希 ...

  9. 什么是Office Online Server和SharePoint 2016

    Microsoft Office Online Server是Microsoft Office Web Apps(OWA)服务器的下一个版本,最初于2012年发布.,可以下载Office Online ...

  10. 51nod 1101 换零钱

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元.   ...