PHP mkdir 无法在服务器中创建目录


PHP mkdir failed to created directory in server

>我在服务器(centos)中创建文件夹时遇到问题,有一个带有文件上传字段的表单,其中ajax回调总是返回错误为:

警告:mkdir():第 90 行的/home/sitename/public_html/inc/callback/request_update.php 中的权限被拒绝

警告:move_uploaded_file(./../images/listing/16/805202.jpg):无法打开流:第 95 行的/home/sitename/public_html/inc/callback/request_update.php 中没有此类文件或目录

警告:move_uploaded_file():无法将"/tmp/phpnrtrdp"移动到"../../images/listing/16/805202.jpg' in/home/sitename/public_html/inc/callback/request_update.php 第 95 行

它指示文件 request_update.php 中的行导致错误:

MKDIR($output_dir, 0755, true);

request_update.php:

if(isset($_FILES['files'])){
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){
    $file_name = $key.'_'.$_FILES['files']['name'][$key];
    $file_size = $_FILES['files']['size'][$key];
    $file_tmp = $_FILES['files']['tmp_name'][$key];
    $file_type = $_FILES['files']['type'][$key];
    //explode fine name and extension
    $ext_x = explode('.', $_FILES['files']['name'][$key]);
    $ext = strtolower(end($ext_x));
    $file_name = str_replace('.'.$ext, '', $_FILES['files']['name'][$key]);
    //new file name
    $output_dir = '../../images/listing/'.$list_id;
    $new_file_name[] = rand(1, 999999).'.'.$ext;
    $pathfile = $output_dir.'/'.end($new_file_name);
    // create directory if does not exist
    if(is_dir($output_dir) == false){
        mkdir($output_dir, 0755, true); /*this is where error indicate*/
    }
    if(is_dir($pathfile) == false){
        if(move_uploaded_file($file_tmp, $pathfile)){
            
            //watermark
            $water_path = '../../images/watermark.jpg';
            $watermark = WideImage::load($water_path);
            
            //resize original image
            WideImage::load($pathfile)->resize(300, 360)->merge($watermark, '50% – 25', '100% – 40', 80)->saveToFile($pathfile);
            
        }
    }
}
}

我已经尝试在另一个共享服务器甚至本地主机中运行相同的代码,该文件夹可以随时创建,发生了什么?

我想

补充到Simon Groenewolt评论答案,你应该从检查PHP是否真的可以在你想要的路径中写入开始,通过使用is_writable函数:

例:

$filename = 'test.txt';
if (is_writable($filename))
  {
    echo 'The file is writable';
  } 
else
  {
    echo 'The file is not writable';
  }

只需设置适当的权限,如 Log1c 在您尝试写入的目录上所述,通过运行 chmod a+w /yourpath/yourdir ,这是 666 ,这意味着所有人的读写userownerworld

<小时 />

is_writable() 如果文件名存在且可写,则返回 TRUE。文件名参数可以是目录名称,允许您检查目录是否可写。

请记住,PHP 可能以 Web 服务器运行的用户 ID 访问文件(通常是"没有人")。不考虑安全模式限制。

编辑 1:

确保 PHP open_basedir设置也设置为访问/tmp。您可以出于测试目的禁用它,看看您得到了什么。尝试通过运行以下命令检查open_basedir设置的设置:

echo ini_get('open_basedir');