Я в настоящее время использую компонент файла в vork платформе для загрузки файла, и я продолжаю получать эту ошибку:
Предупреждение: move_uploaded_file (/загрузки) [function.move-uploaded-file]: не удалось открыть поток: Разрешение, отклоненное в/var/www/rto-vork/mvc/components/file на строке 105
Предупреждение: move_uploaded_file () [function.move-uploaded-file]: Не мог переместить '/tmp/php3WC6QP' в '/uploads' 'в/var/www/rto-vork/mvc/components/file на строке 105 строк (32) "не Могли переместить загруженный файл" успех
Я полагаю, что сам компонент прекрасен, и каталог загрузок уже был chmoded к 777
вот код для загрузки, в которой передается идентификатор файла правильно
public function uploadFile($id, $destination, $imagesOnly = false) {
$return = false;
if (substr($_FILES[$id]['name'], 0, 1) == '.') {
$return = 'File names must not begin with a dot';
} else {
$isInvalidUpload = $this->isInvalidUpload($id, $imagesOnly);
if ($isInvalidUpload) {
$return = $isInvalidUpload;
} else {
if (move_uploaded_file($_FILES[$id]['tmp_name'], $destination)) {
if (is_dir($destination)) {
if ($destination[-1] != '/' && $destination[-1] != '\\') {
$destination .= '/';
}
$destination .= $_FILES[$id]['tmp_name'];
}
chmod($destination, 0777);
} else {
$return = 'Could not move the uploaded file';
}
}
}
return $return;
}
Ваш код ошибочен:
public function uploadFile($id, $destination, $imagesOnly = false) {
...
if (move_uploaded_file(...)) {
if (is_dir(...)) {
...
}
} else {
$return = 'Could not move the uploaded file';
}
}
Вы вызываете метод с помощью uploadFile ('somename', '/ uploads')
, поэтому код сначала пытается переместить загруженный файл в / uploads
напрямую, но это каталог. move_uploaded_file ()
не действует как обычная команда «перемещения» файловой системы, источник И цель должны быть именами файлов. Итак, ваша первоначальная попытка перемещения не удалась, она возвращает false, и все переходит непосредственно к обратному вызову «Не удалось переместить файл». Он даже не пытается обработать $ destination как каталог
. Вам следует реструктурировать метод следующим образом:
public function uploadFile(...) {
...
// if $destination is a directory, handle that fact
if (is_dir($destination)) {
$destination .= '/' . $new_file_name;
}
// THEN try to move the file
if (move_uploaded_file($source, $destination)) {
return('worked');
} else {
return('failed');
}
}
Также имейте в виду, что, хотя это маловероятно, временное имя файла, которое назначает PHP, НЕ гарантированно быть уникальным с течением времени. Вполне возможно, что в какой-то момент в строке снова будет сгенерировано то же случайное имя, и вы перезапишете старую загрузку. Вы должны использовать имя файла, которое гарантированно будет уникальным, например поле «id» первичного ключа из базы данных или какой-либо другой источник неповторяющихся данных.
Похоже, вы пытаетесь переместить либо сам каталог, либо пытаетесь записать каталог вместо файла.
Warning: move_uploaded_file**(/uploads)** [function.move-uploaded-file]: failed to open stream: Permission denied in /var/www/rto-vork/mvc/components/file on line 105
Убедитесь, что вы используете сгенерированное имя временного файла и что вы указываете имя файла для сохранения файла.
Сообщение об ошибке довольно ясное: вы не можете записать в каталог /uploads
.
Неудивительно - на unix-системах никто не разрешает писать в корень системы :)
Это ваша проблема - вы перепутали корень web и корень файловой системы.
в общем, этот код должен помочь, если остальной код в порядке:
$destination = $_SERVER['DOCUMENT_ROOT'].$destination;
но я сомневаюсь, что остальной код в порядке
скажем, $destination .= $_FILES[$id]['tmp_name'];
довольно бессмысленный код.
Я думаю, вам лучше найти себе другой компонент или написать свой собственный