2016-09-08 3 views
-1

Я борется с этим более 8 часов, поэтому надеюсь, что кто-то может мне помочь. Я думаю, что просмотрел все сообщения по этой проблеме, но не смог найти решение.PHP move_uploaded_file() return FALSE

Ошибок нет, и /tmp, и /var/www/test принадлежат apache (www-data) и имеют 775 разрешений.

Это PHP код:

$target_dir = $_SERVER["DOCUMENT_ROOT"] . "test/uploads/"; 
$target_file = $target_dir . basename($_FILES["pic"]["name"]); 
$uploadOK = 1; 
$image_file_type = pathinfo($target_file, PATHINFO_EXTENSION); 

if(isset($_POST['submit'])) { 
if($uploadOK === 0) { 
    echo "Upload failed!"; 
} else { 
    // This is where it stops... 
    // There is definitely something wrong with $target_file 
    if(move_uploaded_file($_FILES["pic"]["tmp_name"], $target_file)) { 
     echo "Success"; 
    } else { 
     echo "Not uploaded...<br>"; 
     echo move_uploaded_file($_FILES["pic"]["tmp_name"], $target_file) . "<br>"; 
     echo $target_file . "<br>"; 
     print_r($_FILES) . "<br>"; 
     error_reporting(E_ALL); 
    } 
} 

Эти результаты я получаю:

Не загружено ...

/var/www/test/uploads/test.jpg

Array (
    [pic] => Array (
     [name] => test.jpg 
     [type] => image/jpeg 
     [tmp_name] => /tmp/phpKlzCxc 
     [error] => 0 
     [size] => 721090 
    ) 
) 

Итак, что я делаю неправильно?

Ok, вот обновление:

  • Проверка загрузки была сделана в начале сценария и работал, поэтому я не включил его в этом вопросе.
  • Это код из www.w3schools.com, и я буду проверять другой источник (спасибо за указав, что из)
  • После фиксации положения error_reporting (хороший вызов :)), наконец, получил целая куча «Permission Denied» предупреждения как я подозревал бы проблема, и вот они:

Предупреждение: move_uploaded_file (/var/www/test/uploads/test.jpg): не удалось открыть поток: Разрешение отклонено в /var/www/test/upload.php в строке 47

Предупреждение: move_uploaded_file(): Не удается переместить '/ TMP/phpHzvhOA' к '' /var/www/test/uploads/test.jpg в /var/www/test/upload.php на линии 47

Строка 47:

if(move_uploaded_file($_FILES["pic"]["tmp_name"], $target_file)) { 

набор разрешений для /var/www/test/upload.php:

-rwxrwxr-x 1 www-data www-data 2174 Sep 9 00:07 /var/www/test/upload.php 
+0

полная проверка ошибок и отображение? – nogad

+0

Как выглядит ваша 'форма? Имеет 'enctyp'? – chris85

+0

Файл, вероятно, уже существует с тем же именем. Одна из причин, по которым вы не должны использовать имена файлов, предоставленных пользователем. –

ответ

0
  • Я бы сначала проверить, если file_exists($_FILES["pic"]["tmp_name"]).

  • Затем проверьте, действительно ли путь $target_file (просто print_r() и проверьте путь справа).

  • Убедитесь, что вы имеете право на запись по адресу $target_file.

+0

это комментарий не ответ – nogad

+0

'file_exists' возвращает true, так что это хорошо. Что касается двух других предложений, как упоминалось выше, $ target_file - это /var/www/test/uploads/test.jpg, и я установил разрешение на 775 для/tmp и/var/www/test. Папка/uploads находится в папке/test – igor253

+0

, почему бы не использовать ** rename ($ _ FILES ["pic"] ["tmp_name"], $ target_file); ** – JorgeObregon

0

Проблема была определенно с разрешениями, как мы и думали. Итак, я запустил

sudo chown -R www-data.www-data и sudo chmod -R 775 для всех трех каталогов, как и раньше. Только сейчас, по какой-то причине, это сработало.

Я использовал -R метод, который, если я правильно понял, то должны были изменены права доступа ко всем вложенным папкам и файлам в /var/www/test директории, где папка /uploads находится, а также ...

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

  1. sudo chown -R www-data.www-data /var/www/test

  2. sudo chmod -R 775 /var/www/test

сделал это также /tmp и /var/www/test/uploads каталогов.