Ошибка move_uploaded_file - PullRequest
       1

Ошибка move_uploaded_file

12 голосов
/ 04 октября 2010

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

if ((move_uploaded_file($_FILES[$field]['tmp_name'], $path))) {

Например, возможные причины.Я проверил, что переменные верны, и я проверил разрешения для папки назначения, которая равна 777.

Cheers!

Для тех, кто хочет видеть var_dump ($ _FILES);

array(1) { ["image"]=>  array(5) { ["name"]=>  string(14) "accountile.png" 
["type"]=>  string(9) "image/png" ["tmp_name"]=>  string(14) "/tmp/php28IQhv" 
["error"]=>  int(0) ["size"]=>  int(394) } }

Ответы [ 10 ]

22 голосов
/ 05 октября 2010

Я проверил переменные

Не проверять переменные, но проверять сообщения об ошибках.
Это единственное, что вам нужно.
Добавьте этистроки в верхней части вашего кода

ini_set('display_errors',1);
error_reporting(E_ALL);

и посмотрите, что он говорит.
Если move_uploaded_file не удалось, он всегда вызовет ошибку с подробное объяснение .
Вы не поверите, но чтение сообщений об ошибках - более эффективный способ найти проблему, чем догадки , которые вы пытались раньше

Не могу поверить, что никто не упомянул об этом,

1 голос
/ 15 апреля 2011

Loïc Février, спасибо, вы сэкономили мне много времени!

Вот моя часть ... печать возможных ошибок во время загрузки.

Сначала создайте каталог Uploader / UploadedFilesТогда используйте код ниже ...

$destination=$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/" . $_FILES["file"]["name"];

if(move_uploaded_file($_FILES["file"]["tmp_name"],  $destination)){
   echo ("Stored in".$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/".$_FILES["file"]["name"]);
}else{
   $html_body = '<h1>File upload error!</h1>';
   switch ($_FILES[0]['error']) {
   case 1:
      $html_body .= 'The file is bigger than this PHP installation allows';
      break;
   case 2:
      $html_body .= 'The file is bigger than this form allows';
      break;
   case 3:
      $html_body .= 'Only part of the file was uploaded';
      break;
   case 4:
      $html_body .= 'No file was uploaded';
      break;
   default:
      $html_body .= 'unknown errror';
   } 
   echo ($html_body);
}
1 голос
/ 27 декабря 2010

Вы редактировали свой php.ini, чтобы убедиться, что upload_tmp_dir указывает на временный каталог?

1 голос
/ 04 октября 2010

Не использовать

$path = "http://www.barbadostravelbuddy.co.uk/demo/images/carhire
    /accountile10420103260403000000pm.png"

но

$path = "/home/sites/barbadostravelbuddy.co.uk/public_html/demo/images/carhire/
    accountile10420103260403000000pm.png"

Это должен быть путь в системе, а не URL.

1 голос
/ 04 октября 2010

Вы проверяли разрешение на временную папку загрузки?

Что php скажет вам, если вы сделаете:

var_dump($_FILES);
1 голос
/ 04 октября 2010

С move_uploaded_file вам не нужно 777 разрешений. Какой вывод $path? Вы убедились, что $path существует? Вы убедились, что $field существует?

Либо $ field или $ path не существует, либо действует open_basedir - мое предположение.

Включено ли ограничение open_basedir? Это может помешать записи в загруженный файл. Найдите в своем php.ini значение open_basedir, если указан указанный путь, он включен, и вы хотите узнать, находится ли путь назначения вашего загруженного файла в этом пути. Если это так, вот почему это не получается.

обновление

$ path не может быть URL, это должен быть локальный путь, например /home/user/public_html/

0 голосов
/ 10 февраля 2019

Я столкнулся с той же проблемой.

Если ваша ошибка говорит "Не удалось открыть поток: отказано в доступе" , это означает, что PHP Server не можетсоздания нового файла в вашем каталоге назначения.

После того, как вы установили разрешения Linux для этого каталога (что похоже на то, что вы сделали, установив его в 777), вы должны дать это специальное разрешение PHP Server.

Если ваша папка называется «uploads», вы должны перейти в предыдущий каталог и использовать следующую команду:

chcon -R -t httpd_sys_rw_content_t uploads

Это определенно решило мою проблему.

Надеюсь, это поможет.

0 голосов
/ 07 мая 2018

Проверка:

enctype="multipart/form-data"

Внутри самой формы, без нее загрузка файлов не будет работать вообще.

0 голосов
/ 04 февраля 2013

$path должно быть именем файла, а не путем к каталогу.

0 голосов
/ 04 октября 2010

Основные этапы отладки:

  • Как выглядит print_r($_FILES)?
  • Исходный файл действительно существует?
  • Является ли флаг "ошибки" загрузки файла нулевым (будет видно при выполнении print_r)
  • Как выглядит цель $path?
  • Вы указываете полное имя файла в целевом пути?

Я предполагаю, что $path - это только путь к папке, а не к полному имени файла.

Обновление: необходимо указать путь к файловой системе в виде $ path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...