Ошибка при попытке загрузить файл в PHP

Я php-страница, все работало нормально до сегодняшнего утра. Теперь страница не загружает ни один выбранный файл. Все, что я продолжаю получать, это следующее сообщение об ошибке:

Предупреждение: move_uploaded_file(upload/BrainStream_2009_06_25_23041.zip) [function.move-uploaded-file]: не удалось открыть поток: нет такого файла или каталога в C:\xampp\htdocs\vectorization\admin\jobs_edit.php в строке 146

Предупреждение: move_uploaded_file() [function.move-uploaded-file]: невозможно переместить «C:\Documents and Settings\Admin\Local Settings\Temp\php1B2.tmp» в «upload/BrainStream_2009_06_25_23041.zip» в C:\xampp \htdocs\vectorization\admin\jobs_edit.php в строке 146 Не удалось загрузить файл. Пожалуйста, выберите допустимый файл. Имя файла:BrainStream.zip

Я написал следующий код:

$uplfile = $_FILES['uploadfile']['name'];   
$upltmp = $_FILES["uploadfile"]["tmp_name"];
if(!empty($uplfile))
{       
    $ext = explode(".", $uplfile);
    
    $upload_date = date("Y_m_d"); //use this variable to change file name to avoid conflict with same name files
    $upload_dir = "upload/";

    $file_name=$ext[0]."_".$upload_date."_".rand(0, getrandmax()).".".$ext[1];
    
    (move_uploaded_file($upltmp,$upload_dir.$file_name))
 }

У меня есть стек XAMPP, установленный на моем ПК, который работает под управлением WinXP, имеет 3 ГБ ОЗУ и достаточно места на жестком диске.

Независимо от того, какой размер файла я выбираю, он всегда выдает ошибку.

Что должно быть не так в этом коде?


person Yogi Yang 007    schedule 25.06.2009    source источник
comment
Небольшое примечание: если rand() вызывается без каких-либо аргументов, он автоматически ведет себя так, как вы его используете.   -  person merkuro    schedule 25.06.2009
comment
Я вижу брешь в системе безопасности: что, если кто-то загрузит файл с именем filename.php.jpg с каким-то вредоносным php-кодом внутри? Вместо $ext[1] используйте $ext[count($ext)-1].   -  person Keeper    schedule 25.06.2009


Ответы (6)


Интересный синтаксис в последней строке. Ошибка указывает на то, что проблема в этой строке и отсутствует либо исходный файл, либо целевой каталог. Поскольку первый создается автоматически, убедитесь, что C:\xampp\htdocs\vectorization\admin\upload существует и доступен для записи.

person phihag    schedule 25.06.2009

@phihag,

Спасибо за подсказку. Один из новых разработчиков при изучении исходников по ошибке удалил (../) в присваивании переменной $upload_dir.

$upload_dir = "upload/"; //this is wrong

На самом деле он был установлен как

$upload_dir = "../upload/"; //this works but accidentally edited by another developer 

Какой я ламер. Я не мог определить проблему.

В любом случае, спасибо один раз за вашу помощь в решении моей проблемы.

person Yogi Yang 007    schedule 25.06.2009

похоже, ваша проблема может заключаться в том, что вы используете прямую косую черту для своего каталога загрузки, но в Windows это будет обратная косая черта, вам также необходимо убедиться, что каталог загрузки относится к сценарию. если не указать полный путь.

Хороший совет для предотвращения проблемы с косой чертой — использовать константу DIRECTORY_SEPARATOR.

person robjmills    schedule 25.06.2009
comment
Разделителями каталогов Windows являются \ и /, так что это не проблема. Как правило, используйте DIRECTORY_SEPARATOR в php или просто /. - person phihag; 25.06.2009
comment
о, действительно, я никогда не работаю с окнами, но всегда предполагал, что причина DIRECTORY_SEPARATOR в том, чтобы предотвратить подобные проблемы. Если нет, то какова его цель? - person robjmills; 25.06.2009

Одно из двух - либо

  1. Нет каталога загрузки
  2. Нет файла php1B2.tmp
person Grouchal    schedule 25.06.2009

Это может показаться очевидным, но не забудьте дважды проверить свой php.ini.

file_uploads = On
upload_tmp_dir = "C:\xampp\tmp"
upload_max_filesize = 64M
person bobobobo    schedule 25.06.2009

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

switch ($_FILES["cv"]["error"])
{
    case UPLOAD_ERR_FORM_SIZE:
       // handle error
    case UPLOAD_ERR_INI_SIZE:
       // handle error
    case UPLOAD_ERR_PARTIAL:
       // handle error
    case UPLOAD_ERR_NO_FILE:
       // handle error
    case UPLOAD_ERR_CANT_WRITE:
       // handle error
}

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

person James    schedule 25.06.2009