Папка назначения загрузки недоступна для записи. (Codeigniter)

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

function town_upload() {


        //Do not create a thumbnail
        $create_thumb = false;

        //Create the path for the upload
        $path = './public/uploads/towns/' . $this->uri->segment(3);

        $config['upload_path'] = $path;
        $config['allowed_types'] = 'jpg';
        $config['max_size'] = '2048';
        $config['max_width'] = '1024';
        $config['max_height'] = '768';
        $config['remove_spaces'] = TRUE;
        $config['overwrite'] = $this->image_upload_overwrite;

        if ($this->input->post('image_type') == 'main_image') {
            $config['file_name'] = 'main.jpg';
            $create_thumb = true;
        } 

        $this->load->library('upload', $config);

        if (!$this->upload->do_upload()) {

            $this->session->set_flashdata('upload_error', array('error' => $this->upload->display_errors()));

        } else {

            //sucess so now we create the thumbnail
            $this->session->set_flashdata('upload_success', $this->upload->data());

Пример: если бы у меня был город с идентификатором 6, каталог для загрузки был бы public / uploads / town / 6. Это прекрасно работает, поскольку каталог создается при создании города. У меня почти такая же функция для отелей, за исключением того, что путь - public / uploads / hotels / [ID]. Я установил разрешения на 777, чтобы убрать это из уравнения.

Я не могу понять этого, поскольку обе функции очень похожи. Вот код для загрузки отеля:

 function hotel_upload() {

        //Create the path for the upload
        $path = './public/uploads/hotels/' . $this->uri->segment(3);

        chmod($path, 0777);

        $config['upload_path'] = $path;
        $config['allowed_types'] = 'jpg';
        $config['max_size'] = '2048'; //kilobytes (2048 = 2mb)
        $config['max_width'] = '1024';
        $config['max_height'] = '768';
        $config['remove_spaces'] = TRUE;
        $config['overwrite'] = TRUE;

        if ($this->input->post('image_type') == 'main_image') {
            $config['file_name'] = 'main.jpg';
        }

        $this->load->library('upload', $config);

        if (!$this->upload->do_upload()) {

            $this->session->set_flashdata('upload_error', array('error' => $this->upload->display_errors() . ' <br/>Path: ' . $path . '<br/>Image Type: ' . $this->input->post('image_type')));

        } else {

            //sucess so now we create the thumbnail
            $this->session->set_flashdata('upload_success', $this->upload->data());

Функция отеля выдает ошибку «Папка назначения загрузки не может быть записана».

Вот HTML-формы страниц:

ГОРОД:

<?php echo form_open_multipart('admin/town_upload/' . $this->uri->segment(3));?>

            <input type="file" name="userfile" size="20" />

            <br /><br />

            <p>
                <input type="radio" name="image_type" checked="checked" class="radio" value="main_image" /> <label>Main Image</label>
                <input type="radio" name="image_type" class="radio" value="other_image" /> <label>Other Image</label>
            </p>

            <input type="submit" class="submit short" value="upload" />

        <?php echo form_close(); ?> 

ОТЕЛЬ:

<?php echo form_open_multipart('admin/hotel_upload/' . $this->uri->segment(3));?>

            <input type="file" name="userfile" size="20" />

            <br /><br />

            <p>
                <input type="radio" name="image_type" checked="checked" class="radio" value="main_image" /> <label>Main Image (shown when visitors search the website)</label>
                <input type="radio" name="image_type" class="radio" value="other_image" /> <label>Standard Image</label>
            </p>

            <input type="submit" class="submit short" value="upload" />

        <?php echo form_close(); ?> 

Заранее спасибо! Работаю над этим уже несколько часов .. :(


person SamV    schedule 24.04.2011    source источник
comment
Нужен ли весь этот пример кода, чтобы ответить на вопрос? Я в этом сомневаюсь. Приведите короткий пример, воспроизводящий проблему.   -  person cweiske    schedule 24.04.2011
comment
Действительно ли целевой каталог существует? Где ты это создаешь? Оба сценария находятся в одном каталоге?   -  person Pekka    schedule 24.04.2011
comment
@cweiske Это весь код, который требуется в качестве сценария загрузки отеля, поскольку метод do_upload всегда возвращает false. С помощью HTML-формы я отправляю простое изображение, отвечающее всем требованиям.   -  person SamV    schedule 24.04.2011
comment
@Pekka: оба сценария находятся в одном контроллере, и целевой каталог существует, как я много раз проверял с помощью FTP-клиента. Если его нет, все равно появляется другая ошибка.   -  person SamV    schedule 24.04.2011
comment
@Sam, можешь попробовать is_writable() в каталоге?   -  person Pekka    schedule 24.04.2011
comment
@Pekka вернул истину. Я назвал этот код [эхо-запись:. is_writable ($ путь); выход(); ] и вернул доступный для записи: 1   -  person SamV    schedule 24.04.2011


Ответы (3)


Ваш код не проверяет работу chmod. Например, по умолчанию apache любит работать как собственный пользователь или никто, а не вы как пользователь. Таким образом, chmod в вашем файле может обнаружить, что пользователь, который в данный момент работает, не владеет файлом, поэтому chmod завершится ошибкой.

Первым делом я бы проверил пользователя, которого PHP считает, что он работает, и владельца файла.

Есть функция is_writable, вы можете проверить, доступен ли каталог для записи.

person BugFinder    schedule 24.04.2011
comment
Мне даже не нужно изменять его, так как каталог уже 777, я читал об этом, но я не понимаю, почему функция town_upload работает, а функция hotel нет, поскольку они в основном одно и то же. Просто проверил, доступен ли он для записи, и он вернул истину. На самом деле не знаю, что происходит! - person SamV; 24.04.2011
comment
Можете ли вы сделать echo $config["upload_path"]; после того, как настроите его, чтобы мы увидели то, что вы ожидаете - person Dormouse; 24.04.2011
comment
Он вернул ./public/uploads/hotels/7, и Filezilla говорит, что он там тоже. - person SamV; 24.04.2011
comment
также проверьте команду safe_mode в файле php.ini, она должна быть в выключенном режиме. - person Dormouse; 24.04.2011
comment
Главное значение выключено, а локальное включено? Почему тогда работает другая функция ?? - person SamV; 24.04.2011

Я столкнулся с той же проблемой и нашел возможную причину такого поведения. В моем случае я создал каталог для загрузки некоторое время назад. Я обновил php, добавив новый файл php.ini с safe_mod = On.. И теперь, когда я воссоздал каталог после его стирания, новые параметры php выдали это сообщение об ошибке.

Возможно ли, что вы создали дерево каталогов города до обновления PHP и дерево каталога отеля после него?

person hrasm    schedule 08.05.2011

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

person SamV    schedule 01.03.2013