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 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上传文件到服务器(实战篇)的更多相关文章
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
- Linux通过FTP上传文件到服务器
1.如果没有安装ftp,可执行: 输入:yum -y install ftp,回车 等待安装完毕 2.连接服务器 输入:ftp 服务器IP,回车 根据提示输入用户名和密码 3.上传下载操作 1). 上 ...
- ftp上传文件,本地安装了,服务器上也需要在也安装一个ftp
服务器需要配置FTP服务: 你说的在你自己电脑上安装的只是一个FTP软件,用于连接远程服务器进行上传和下载文件的. 追问 在本地已经安装了,链接的话要在服务器上也安装一个吗? 追答 额,你有FTP服务 ...
- C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误
FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...
- 再看ftp上传文件
前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
- FTP 上传文件
有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...
- Java ftp 上传文件和下载文件
今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...
随机推荐
- IBM WebSphere MQ
相关链接: http://kakajw.iteye.com/category/269774 http://www.ibm.com/support/knowledgecenter/zh/SSFKSJ_7 ...
- ios Realm的使用 本地数据存储
引入需要的文件 pod 'RealmSwift' pod 'Realm' 然后在命令行使用 (首先应该cd到项目的根目录)输入 pod install 等待下载就行了(这个下载有点费劲,其他的插件包下 ...
- Jmeter4.0----监控服务器性能(7)
1.说明 JMeter是一款压力测试工具. 通常在压力测试中我们也需要监控和知道服务器的相关资源情况,jmeter本身不具备这个功能,今天我们主要说一下如何通过JMeter插件来监控服务器CPU.内存 ...
- 简易的开发框架(微服务) Asp.Net Core 2.0
Asp.Net Core 2.0 + Mysql Orm + Ioc + Redis + AOP + RabbitMQ + Etcd + Autofac + Swagger 基础框架: https ...
- 洛谷P1781 宇宙总统
https://www.luogu.org/problem/show?pid=1781 高精比较大小: #include<iostream> #include<cstdio> ...
- css3的animation动画
animation 设置对象的动画特效 有6个主要的值 animation-name 动画名称 animation-duration 动画持续时间 animation-timing-fun ...
- swift基础-3
fallthrough 贯穿 case 可以不必写break 如果不需要知道区间内 每一项的值 可以使用 下划线 —— 来代替变量名 忽略 对该值的访问 for index in 1...5{ p ...
- 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf
1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩 ...
- js push(),pop(),shift(),unshift()
以前没有太在意这些,这几天看<Javascript 设计模式与开发实践>(不得不说这是一本好书) 发现总是会用到这几个函数,可是有什么区别呢?? 简单来说是两套东西(数据结构时老师详细的讲 ...
- Azure 镜像市场支持一键部署到云
本视频教程介绍了Azure 镜像市场和一键部署到云. Azure 镜像市场(AMP)由世纪互联运营,是一个联机应用程序和服务市场,它通过独立软件服务商(ISV)能够成为 Azure 客户(Custom ...