这是我的 PHP 代码。实际上效果很好:
$newftpdir_parent = date('Ymd'); // YYYYMMDD
$newftpdir_child = $ext_folder; // username
$newftpdir = $newftpdir_parent.'/'.$newftpdir_child; // YYYYMMDD/username
$conn_id = ftp_connect($uptoftp_server);
ftp_login($conn_id, $uptoftp_username, $uptoftp_pass);
$path_of_storage = $uptoftp_path_abs.'/'.$uptoftp_path_rel; // /var/www/uploads
if( !@ftp_chdir($conn_id, $path_of_storage.'/'.$newftpdir_parent) ){
ftp_mkdir($conn_id, $path_of_storage.'/'.$newftpdir_parent);
ftp_chmod($conn_id, 0777, $path_of_storage.'/'.$newftpdir_parent);
}
if( !@ftp_chdir($conn_id, $path_of_storage.'/'.$newftpdir) ){
ftp_mkdir($conn_id, $path_of_storage.'/'.$newftpdir);
ftp_chmod($conn_id, 0777, $path_of_storage.'/'.$newftpdir);
}
ftp_chdir($conn_id, $path_of_storage.'/'.$newftpdir);
ftp_put($conn_id, $file_name, $filetoftp, FTP_ASCII);
ftp_close($conn_id);
它将文件从本地服务器上传到远程 ftp 服务器。正如你所看到的,有 2 个丑陋的 if 条件检查目录是否存在,如果不存在,我们创建它并移入其中。再次针对子目录。由于我现在希望我的目录(在 ftp 服务器上)看起来像 YYYY/MM/DD/username 而不是 YYYYMMDD/username,因此我需要再创建两个这样的 if 块。它工作得很好,但它看起来不干净,我有点疯狂......我想知道是否有更好的方法来做到这一点,因为 ftp_mkdir() 无法创建多个目录(其中包含子目录的目录)?
例如,仅考虑 /uploads/ 目录存在,而不存在 /2013/ 子目录 /06/ 和 /11/ :
ftp_mkdir($conn_id, '/var/www/uploads/2013/06/11');
返回:
Warning: ftp_mkdir() [function.ftp-mkdir]: /var/www/uploads/2013/06/11: No such file or directory in /home/blabla/www/test.php on line 18
<?php
// function
function ftp_mksubdirs($ftpcon,$ftpbasedir,$ftpath){
@ftp_chdir($ftpcon, $ftpbasedir); // /var/www/uploads
$parts = array_filter(explode('/',$ftpath)); // 2013/06/11/username
foreach($parts as $part){
if(!@ftp_chdir($ftpcon, $part)){
ftp_mkdir($ftpcon, $part);
//ftp_chmod($ftpcon, 0775, $part);
ftp_chdir($ftpcon, $part);
}
}
}
// usage
$path_of_storage = '/var/www/uploads';
$newftpdir = '2013/06/11/username';
$conn_id = ftp_connect($ftpserver);
ftp_login($conn_id, $login, $pass);
ftp_mksubdirs($conn_id,$path_of_storage,$newftpdir);
ftp_close($conn_id);
?>
找到这个,也许有帮助:
function ftp_mkdir_recusive($con_id,$path){
$parts = explode("/",$path);
$return = true;
$fullpath = "";
foreach($parts as $part){
if(empty($part)){
$fullpath .= "/";
continue;
}
$fullpath .= $part."/";
if(@ftp_chdir($con_id, $fullpath)){
ftp_chdir($con_id, $fullpath);
}else{
if(@ftp_mkdir($con_id, $part)){
ftp_chdir($con_id, $part);
}else{
$return = false;
}
}
}
return $return;
}
$dir = "/2012/05/02/"
if(ftp_mkdir_recusive($con_id,$dir)){
print("Successfully created $dir");
}else{
print("There was a problem while creating $dir");
}
我定义了完整的功能,你可以使用(我在wordpress中测试,使用没有问题):
function ftp_mksubdirs($con_id,$ftpbasedir,$path){
// Set Base Dir
if($ftpbasedir == null || ftp_chdir($con_id, $ftpbasedir)){
//Check If Path is Exist,
$ftp_exist = ftp_nlist($con_id, $path);
if (is_array($ftp_exist) || (is_bool($ftp_exist) && $ftp_exist == true)){
// Path Is Exist, Move to $path
ftp_chdir($con_id, $path);
return true;
}
// Split Path
$parts = explode("/",$path);
// Check Part by Part Of Path
foreach($parts as $part){
// if Part is not Empty
if(!empty($part)){
/////////////////////////////
/// *** Filters *** \\\
if(str_replace(" ","",$part) != ".."){
//Go To Parent Directory
ftp_cdup($con_id);
// Check Next $part
continue;
}else if(str_replace(" ","",$part) != ".") {
//Ignore & pass
continue;
}
/// *** [END] Filters *** \\\
/////////////////////////////
// Check If Folder is't Exist
$exis = ftp_nlist($con_id, $part);
if (is_bool($exis) && $exis == false) {
//If Can Make Folder
if(ftp_mkdir($con_id, $part)){
// Move Directory To this Folder
ftp_chmod($con_id, 0777, $part);
ftp_chdir($con_id, $part);
}
else {
// We can't Create Folder, Check Your User Permission.
return false;
}
}else{
// Folder Existed.
// Move Directory To this Folder
ftp_chdir($con_id, $part);
}
}
}// End Foreach
}else{
//Can't Set The Base
// return ftp_mksubdirs($con_id,$ftpbasedir,$path);
}
return true;
}
演示使用:
$path = "/hamid/reza/irani";
$conn_id = ftp_connect($ftp_server, $ftp_server_port);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// if you don't need to change base, set it to null; else : Your Path
// -> I Recommend set base path in $BASE;
$base = null; // or $base = "/";
if(ftp_mksubdirs($con_id, $base, $path )){
print("Successfully created $dir");
}else{
print("There was a problem while creating $dir");
}