使用PHP,如果我没有';我不知道那个目录是否已经存在?

使用PHP,如果我没有';我不知道那个目录是否已经存在?,php,ftp,Php,Ftp,我有一个web应用程序,允许用户将图像上载到我的网站 我想做的不是自己托管这些图像,而是将这些图像推送到我的CDN(Cachefly) 使用PHP,每当用户将图像上载到我的服务器时,我都希望将图像从我的服务器FTP到另一个服务器 但是,我希望维护当前服务器的文件结构路径。也就是说,本地的文件系统计划是: local: upload/YYYY/MM/DD/uniquefilename.jpg 因此,我希望在我的CDN上将图像上载到: cdn: upload/YYYY/MM/DD/unique

我有一个web应用程序,允许用户将图像上载到我的网站

我想做的不是自己托管这些图像,而是将这些图像推送到我的CDN(Cachefly)

使用PHP,每当用户将图像上载到我的服务器时,我都希望将图像从我的服务器FTP到另一个服务器

但是,我希望维护当前服务器的文件结构路径。也就是说,本地的文件系统计划是:

local:  upload/YYYY/MM/DD/uniquefilename.jpg
因此,我希望在我的CDN上将图像上载到:

cdn:  upload/YYYY/MM/DD/uniquefilename.jpg
问题是/yyy/MM/DD目录可能存在,也可能不存在

我正在使用下面的PHP代码,但当目录(/YYYY/MM/DD)当前不存在时,这不会创建它们

如何在维护文件结构的同时将图像FTP到远程服务器?

<?php
// set up basic connection
$conn_id = ftp_connect($ftp_server); 

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// check connection
if ((!$conn_id) || (!$login_result)) { 
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
        exit; 
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name";
    }

// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); 

// check upload status
if (!$upload) { 
        echo "FTP upload has failed!";
    } else {
        echo "Uploaded $source_file to $ftp_server as $destination_file";
    }

// close the FTP stream 
ftp_close($conn_id); 
?>


为什么不在谷歌上搜索ftp\u mkdir?(这是我尝试的第一件事,是的,它的手动页面是第一个结果。)

您可以在上载图像之前隐式尝试并创建目录(带有错误抑制):


我通常尝试执行
ftp\u chdir
,如果失败,我尝试使用
ftp\u mkdir
创建目录,如果失败,我抛出一个错误。否则,您将不得不列出目录,捕获输出,并解析它以查找目录,然后尝试执行
ftp\u mkdir

不可否认,这是一个丑陋的黑客

@维克多:嗯,我们在这里谈论的是php。如果它能让你感觉更好的话,你可以用try/catch块来包装它,但实际上它也会做同样的事情。如果没有测试目录的方法(php没有),您将不得不这样做


如果这能让你感觉更好的话,我从来没有见过一个php ftp脚本做得有任何不同。见鬼,像这样的代码在屏幕上

但是,在我尝试创建目录之前,如何检查目录的存在性呢。您只需尝试创建它(以及它的祖先,如果必要的话)。如果我尝试创建目录,但它确实存在,会发生什么?它将失败,因为那里已经有一个目录。没什么大不了的。我自己不会这样做,因为它可能会因为不止一个原因(例如,您没有创建目录的权限或其他原因)而失败。请注意,我的“解决方案”并不是更好,所以我想我不应该抱怨。如果我使用PHP‘system(ftp…)命令,这会更容易吗?我建议不要使用system()变量,因为执行shell命令比将命令限制为单个mkdir()安全得多。同意不使用system();这不会给你带来任何好处,而且会引起问题。
// assume you used substr() on your $destination_file to get the directory
// and named that variable $destination_dir
@ftp_mkdir($conn_id, $destination_dir);