/** * 创建目录 * @param string $path 目录路径 * @return boolean|string */ function makeDir($path) { $path = str_replace(array('/', '\\', '//', '\\\\'), DIRECTORY_SEPARATOR, $path); $dirs = explode(DIRECTORY_SEPARATOR, $path); $tmp = ''; foreach ($dirs as $dir) { $tmp .= $dir . DIRECTORY_SEPARATOR; if (!file_exists($tmp) && !mkdir($tmp, 0777)) { return $tmp; } } return true; }
以上程序绝大多数没有问题,但是在部分安全要求严格的服务器上,就会产生问题。
例如,假设需要创建 D:\server\www\temp 目录,如果网站没有D盘的读取权限,则file_exists就会返回false,于是程序尝试去创建D盘目录,显然这不是我们期望的。我建议的做法,就是替换掉网站根路径,不管传进来的参数有没包含根路径,在判断目录是否存在和创建目录时再加上网站根路径。
改良后的代码:
function makeDir($path) { $path = str_replace(array('/', '\\', '//', '\\\\'), DIRECTORY_SEPARATOR, $path); $path = str_replace(ROOT_PATH, '', $path); //替换网站根路径, ROOT_PATH 通常可以在配置文件里定义 $dirs = explode(DIRECTORY_SEPARATOR, $path); $relativePath = ''; foreach ($dirs as $dir) { if ($dir) { $relativePath .= $dir . DIRECTORY_SEPARATOR; $realPath = ROOT_PATH . $relativePath; if (!file_exists($realPath) && !@mkdir($realPath, 0777)) { return $realPath; } } } return true; }
define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);
makeDir('upload/2012/11/12');//或者 makeDir(ROOT_PATH . 'upload/2012/11/12');