2016-02-24 2 views
0

Я пытаюсь загрузить файл через PHPНе удается загрузить файл через php?

Html Form

<!DOCTYPE html> 
<html> 
<body> 

<form action="upload.php" method="post" enctype="multipart/form-data"> 
    Select image to upload:</br> 
    <input type="file" name="fileToUpload" id="fileToUpload"></br> 
    <input type="submit" value="Upload Image" name="submit"> 
</form> 

</body> 
</html> 

PHP

<!DOCTYPE html> 
<html> 
<body> 

<form action="upload.php" method="post" enctype="multipart/form-data"> 
    Select image to upload:</br> 
    <input type="file" name="fileToUpload" id="fileToUpload"></br> 
    <input type="submit" value="Upload Image" name="submit"> 
</form> 

</body> 
</html> 
[email protected]:/var/www/html$ cat upload.php 
<?php 
$target_dir = "/home/rohit/uploads"; 
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); 
$uploadOk = 1; 
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
// Check if image file is a actual image or fake image 
if(isset($_POST["submit"])) { 
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); 
    if($check !== false) { 
     echo "File is an image - " . $check["mime"] . "."; 
     $uploadOk = 1; 
    } else { 
     echo "File is not an image."; 
     $uploadOk = 0; 
    } 
} 
// Check if file already exists 
if (file_exists($target_file)) { 
    echo "Sorry, file already exists."; 
    $uploadOk = 0; 
} 
// Check file size 
if ($_FILES["fileToUpload"]["size"] > 500000) { 
    echo "Sorry, your file is too large."; 
    $uploadOk = 0; 
} 
// Allow certain file formats 
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") { 
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 
    $uploadOk = 0; 
} 
// Check if $uploadOk is set to 0 by an error 
if ($uploadOk == 0) { 
    echo "Sorry, your file was not uploaded."; 
// if everything is ok, try to upload file 
} else { 
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { 
     echo "The file ". basename($_FILES["fileToUpload"]["name"]). " has been uploaded."; 
    } else { 
     echo "Sorry, there was an error uploading your file."; 
    } 
} 
?> 

Apache журналы

move_uploaded_file failed to open stream: Permission denied in /var/www/html/upload.php 

на линии 37, реферер: http://localhost/filetest.htm

Я уже пробовал все упомянутое here, но все еще стоял перед проблемой.

Вот разрешения для папок

drwxr-xr-x 2 www-data rohit 4096 Feb 24 15:58 tmp_uploads 
drwxr-xr-x 2 www-data rohit 4096 Feb 24 15:05 uploads 

я получил от владельца

<?php echo exec('whoami'); ?> 

chown user destination_dir 
chmod 755 destination_dir 

, а затем изменил владелец папки с этим пользователем.

Может ли кто-нибудь помочь мне разблокировать, пожалуйста?

+0

сделайте этот php: что вы получаете? – hanshenrik

+0

@hanshenrik array (0) {} array (1) {["submit"] => string (12) "Upload Image"} array (1) {["fileToUpload"] => array (5) {["name "] => string (9)" page1.png "[" type "] => string (9)" image/png "[" tmp_name "] => string (33)"/home/rohit/tmp_uploads/phpCwZA6V " ["error"] => int (0) ["size"] => int (205237)}} – Dude

+0

@hanshenrik Но в соответствии с журналами apache существует некоторая ошибка, разрешенная Permission. Каков источник/разрешение для этого? – Dude

ответ

0

Кажется, что это может быть слишком просто, но если вы отказываетесь от разрешений, попробуйте установить разрешения на 0777 и тестирование. Если это работает, попробуйте 0775 (вместо 0755). Если это работает, то группа вызывает у вас проблему. Если это так, попробуйте переключить владельца и группу.

chown rohit:www-data tmp_uploads 
chown rohit:www-data uploads 
+0

Я тоже пробовал с 777. – Dude

+0

Кроме того, не забудьте проверить результат '$ target_file', если у вас отсутствует косая черта или что-то в этом роде. –

+0

Да, это была пропавшая косая черта. Я потратил на это больше двух часов. – Dude

3

Похоже, проблема заключается в том, как вы строите в $ целевой_файл:

$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); 

Вы должны положить «/» между $ target_dir и базовое имя файла загрузки, как:

$target_file = $target_dir . '/'. basename($_FILES["fileToUpload"]["name"]); 

Или просто установить $ target_dir к (обратите внимание на закрытие '/'):

$target_dir = "/home/rohit/uploads/" 

Без этого он пытается переместить файл в '/ home/rohit', у которого пользователь www-data может не иметь соответствующих разрешений.

0

В зависимости от конкретной конфигурации ОС/пакета Apache не может писать внешний корневой документ.

Кстати, в большинстве случаев эта проблема может быть просто в дереве каталогов: каждый родительский каталог пути назначения должен иметь выполнить установленный бит (х) для пользователя Apache (или для своей группы, или для всех). Только бит выполнения, а не разрешение на чтение/запись (за исключением директории, в которой нужно писать, очевидно).

Таким образом, в вашем конкретном случае, проверьте, если выполнить бит установлен для

  • /дома
  • /дома/Рохит
  • /дома/Rohit/добавления

Пусть я знаю, если это сработает. Для меня это работает в большинстве ситуаций.

Смежные вопросы