Загрузка файла 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;
}