Проблема с загрузкой (разрешение отклонено) - PullRequest
1 голос
/ 29 июня 2010

В настоящее время я использую файловый компонент в среде vork для загрузки файла, и я получаю эту ошибку:

Предупреждение: move_uploaded_file (/ uploads) [function.move-uploaded-file]: ошибкаоткрыть поток: в линии / var / www / rto-vork / mvc / components / file отказано в разрешении на строку 105

Предупреждение: move_uploaded_file () [function.move-uploaded-file]: невозможно переместить '/tmp / php3WC6QP 'to' / uploads 'в / var / www / rto-vork / mvc / components / file в строке 105 строка (32) "Не удалось переместить загруженный файл" успех

Я считаю, что компонентсамо по себе все в порядке, и каталог для выгрузки уже смоделирован на 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;

}

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

Ваш код неисправен:

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, NOT гарантированно будет уникальным во времени. Вполне возможно, что в какой-то момент в будущем снова будет сгенерировано то же случайное имя, и вы перезапишете более старую загрузку. Вам следует использовать имя файла, которое гарантированно будет уникальным, например, поле 'id' первичного ключа из базы данных или какой-либо другой источник неповторяющихся данных.

0 голосов
/ 29 июня 2010

Сообщение об ошибке довольно ясно: вы не можете писать в каталог /uploads.
Не удивительно - в системах unix никто не разрешает вам писать в системный корень:)
Это ваша проблема - вы все испортиликорень сети и корень файловой системы.
В общем, этот код должен помочь, если с остальным кодом все в порядке:

$destination = $_SERVER['DOCUMENT_ROOT'].$destination;

, но я сомневаюсь, что остальной код в порядке
скажем, $destination .= $_FILES[$id]['tmp_name']; довольно бессмысленный код.
Я думаю, вам лучше найти себе другой компонент или написать свой собственный

0 голосов
/ 29 июня 2010

Похоже, вы пытаетесь переместить либо сам каталог, либо вы пытаетесь написать каталог вместо файла.

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

Убедитесь, что вы используете созданное временное имя файла и что вызадают имя файла для сохранения файла как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...