У меня очень простой сценарий загрузки, возможно, снятый прямо с страницы функций php.net/move_upload_files.
move_uploaded_file()
не удалось, поскольку он не может найти файл tmp в папке tmp. Но я ЗНАЮ, что он помещается туда, но удаляется до того, как move_upload_file()
может работать с ним в моем скрипте. Я знаю, что он помещается туда, так как я могу видеть файл там, когда большой файл отправляется на сервер.
Также $_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) Имеются ли значения post_max_size и upload_max_filesize выше, чем размер файла, который вы пытаетесь загрузить?
2) Выполняет ли ваш сценарий загрузки больше времени для выполнения, чем позволяет значение переменной max_execution_time?
3) Я предполагаю, что ваш сценарий загрузки не потребляет столько памяти, сколько позволяет переменная memory_limit. Когда клиент загружает файл на сервер, тогда сервер, вероятно, держит его в памяти, делая это. Я не уверен, что это каким-то образом влияет на ограничение переменной memory_limit в php.ini.
Эти переменные могут быть изменены в php.ini и / или .htaccess или с помощью ini_set ().
Надеюсь, это поможет.
Файл будет удален после завершения выполнения скрипта. Если вы запустите свой скрипт, а затем проверьте папку / tmp /, файл не будет там ни на что.
Я пробовал http://www.w3schools.com/php/php_file_upload.asp И я наткнулся на ту же ошибку.
В моем случае добавление «./» перед $ destination решило проблему.
bool move_uploaded_file ( string $filename , string $destination )
Также может быть, что папка назначения не существует или у вас нет разрешения на запись.
У меня тоже была эта проблема, наткнулся на этот сайт для решения – не получил этого;)
Я получал правильную информацию при просмотре print_r($_FILES)
но не смог выполнить move_uploaded_file
…
Я решил проблему, проверив $upload_file
пути $upload_file
в функции move_uploaded_file
– убедитесь, что он прав, иначе он не будет работать (мой был неправильным).
Кроме того, файл во временном расположении автоматически удаляется, я думаю, что так работает PHP.
Надеюсь, это помогло.
Вы на 100% уверены, что файл действительно создан в / tmp? Если у вас нет разрешения на запись (или пользователь запускает сценарий), файл не будет записан в / tmp, но (я предполагаю) вы увидите его во время загрузки, хотя на самом деле это не происходит, когда загрузка заканчивается.
Изменить: $ _FILES ['file'] ['error'] – Значение: 7; Не удалось записать файл на диск. Представлен в PHP 5.1.0. Поэтому проверьте свою PHP-версию. Если это ниже 5.1, запись на диск может быть вашей проблемой.
У меня была эта проблема. В моем случае php загружался в неправильную папку tmp. Вместо использования домена tmp (в виртуальном хосте на plesk) он загружался прямо в временную папку ОС.
Проверьте настройки временных папок
Для справки в будущем это также может произойти, когда Apache не имеет доступа к целевому каталогу (не забудьте изменить ACL!).
У меня была та же проблема, где «tmp_name» скажет, что она хранится в '/ private / var / tmp /', но файл там не существует.
Мне пришлось добавить «E» в мой «порядок переменных» в php.ini; variables_order Значение по умолчанию: "EGPCS"
Надеюсь это поможет.
Простой тест, выполняемый непосредственно перед функцией 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"]);
будьте осторожны с вашим $ upload_file. возможно, это было отсутствие «/» при конкатенации пути к папке и имени загруженного файла.
В вашей form
должен использоваться тег:
<form method="post" enctype="multipart/form-data" action="...">
Используйте multiple/form-data
как enctype
.
Вы используете возвращаемое значение 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; }