Загрузка файла PHP, файлы, исчезающие из /tmp перед move_uploaded_files

У меня очень простая загрузка script, возможно, снятая прямо с страницы функций php.net/move_upload_files.

move_uploaded_file() не удалось, поскольку он не может найти файл tmp в папке tmp. Но я ЗНАЮ, что он помещается туда, но удаляется до того, как move_upload_file() справится с этим в моем script. Я знаю, что он помещается туда, так как я вижу файл там, где большой файл отправляется на сервер.

Также $_FILES содержит правильные сведения о файле, который я только что загрузил.

У кого-нибудь есть идея, почему временный файл удаляется из /tmp, прежде чем у меня есть возможность его обработать?

Вот базовый код, который я использую.

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file))
{
    $result['error'] = 'false';
    $result['file_loc'] = $upload_file;
}
else
{
    $result['error'] = 'true';
}

Вывод print_r($_FILES) выглядит как

[userfile] => Array
(
    [name] => switchsolo.png
    [type] => image/png
    [tmp_name] => /tmp/phpIyKRl5
    [error] => 0
    [size] => 6690
)

Но/tmp/phpIyKRl5 просто не существует.

Ответы

Ответ 1

1) Значения post_max_size и upload_max_filesize выше, чем размер файла, который вы пытаетесь загрузить?

2) Выполняет ли загрузка script более длительное время, чем значение переменной max_execution_time позволяет?

3) Я предполагаю, что ваша загрузка script не потребляет столько памяти, сколько позволяет переменная memory_limit. Когда клиент загружает файл на сервер, тогда сервер, вероятно, держит его в памяти, делая это. Я не уверен, что это каким-то образом влияет на ограничение переменной memory_limit в php.ini.

Эти переменные могут быть изменены в php.ini и/или .htaccess или с помощью ini_set().

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

Ответ 2

Файл удаляется после завершения выполнения script. Если вы запустите свой script, а затем проверьте папку /tmp/, файл не будет там ни на что.

Ответ 3

Я пробовал http://www.w3schools.com/php/php_file_upload.asp И я наткнулся на ту же ошибку.

В моем случае добавление "./" до адресата $решило проблему.

bool move_uploaded_file ( string $filename , string $destination )

Ответ 4

У меня тоже была эта проблема, наткнулся на этот сайт для решения - не получил его;)

Я получал правильную информацию при просмотре print_r($_FILES), но не смог выполнить move_uploaded_file...

Я решил проблему, проверив атрибут пути $upload_file в функции move_uploaded_file - убедитесь, что он правильный, иначе он не будет работать (мой был неправильным).

Кроме того, файл в временном расположении автоматически удаляется, я думаю, что так работает PHP.

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

Ответ 5

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

Ответ 6

Вы на 100% уверены, что файл действительно создан в /tmp? Если у вас нет разрешения на запись (или пользователь, с которым работает script), файл не будет записан в /tmp, но (я предполагаю) вы увидите его во время загрузки, хотя на самом деле это не происходит, когда загрузка отделки.

Изменить: $_FILES ['file'] ['error'] - Значение: 7; Не удалось записать файл на диск. Представлен в PHP 5.1.0. Поэтому проверьте свою PHP-версию. Если это ниже 5.1, запись на диск может быть вашей проблемой.

Ответ 7

У меня была эта проблема. В моем случае php загружался в неправильную папку tmp. Вместо использования домена tmp (в виртуальном хосте на plesk) он загружался прямо в временную папку ОС.

Проверьте настройки временных папок

Ответ 8

Для справки в будущем это также может произойти, когда Apache не имеет доступа к целевому каталогу (не забудьте изменить ACL!).

Ответ 9

У меня была та же проблема, где 'tmp_name' скажет, что она хранится в '/private/var/tmp/', но файл там не существует.

Мне пришлось добавить "E" в мой "порядок переменных" в php.ini ; variables_order  Значение по умолчанию: "EGPCS"

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

Ответ 10

Простой тест, выполняемый непосредственно перед функцией move_uploaded_file():

if (!file_exists("upload")) {
  if (mkdir("upload")) {
    echo "Upload directory created!";
  }
  else {
    die( "Invalid upload directory!" );
  }
}
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);

Ответ 11

будьте осторожны с вашим $upload_file. возможно, это было отсутствие "/" при конкатенации пути к папке и имени загруженного файла.

Ответ 12

Ваш form должен использовать тег, подобный этому:

<form method="post" enctype="multipart/form-data" action="...">

Используйте multiple/form-data как enctype.

Ответ 13

Вы используете возвращаемое значение move_uploaded_file() неправильным образом:

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file))
{
    $result['error'] = 'true';
}
else
{
    $result['error'] = 'false';
    $result['file_loc'] = $upload_file;
}