我在服务器(centos)中创建文件夹时遇到问题,有一个带有文件上传字段的表单,其中ajax回调总是返回错误:
警告:mkdir():第90行/home/sitename/public_html/inc/callback/request_update.php中的权限被拒绝
警告:move_uploaded_file(../../ images / listing / 16 / 805202.jpg):无法打开流:/home/sitename/public_html/inc/callback/request_update.php上没有此类文件或目录第95行
警告:move_uploaded_file():无法移动' / tmp / phpnrtrdp'到' ../../ images / listing / 16 / 805202.jpg'在第95行的/home/sitename/public_html/inc/callback/request_update.php
并指出文件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);
}
}
}
}
我已尝试在另一个共享服务器甚至localhost中运行相同的代码,该文件夹可以一直创建,会发生什么?
答案 0 :(得分:1)
我想添加 Simon Groenewolt 评论 - 答案,你应该从检查 PHP 是否能真正写入你想要的路径开始,使用{{3功能:
示例:
$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
,即阅读和撰写所有人,user
,owner
和world
。
is_writable()如果文件名存在且可写,则返回TRUE。 filename参数可以是目录名,允许您检查目录是否可写。
请记住,PHP可能正在以Web服务器运行的用户ID(通常是“nobody”)访问该文件。不考虑安全模式限制。
确保 PHP open_basedir
设置也设置为访问/tmp
。您可以将其禁用以进行测试,以查看您获得的内容。通过运行以下命令,尝试检查open_basedir
设置的设置:
echo ini_get('open_basedir');