загрузка фотографий в облачные файлы server/rackspace - php/codeigniter

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

Не удалось открыть файл для чтения: /tmp/php0d4X5Ny/mylogo.jpg

Мне нужно выяснить, почему я получаю эту ошибку.

Вот мой код из контроллера (cloudfiles.php):

        public function add_local_file()
        {
                $file_location = $_FILES['userfile']['tmp_name'].'/';
                $file_name = $_FILES['userfile']['name'];

                $this->cfiles->do_object('a', $file_name, $file_location);

                $this->_show_errors('Image Added!');
        }

Функция do_object находится здесь. (строка 151). А вот представление загрузки:

<?php echo form_open_multipart('cloudfiles/add_local_file'); ?>

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

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

<?php echo form_close(); ?>

Я поискал в библиотеке cloudfiles и обнаружил, что ошибка «не удалось открыть файл для чтения» является исключением в этой функции:

function load_from_filename($filename, $verify=true)
    {
        $fp = @fopen($filename, "r");
        if (!$fp) {
            throw new IOException("Could not open file for reading: ".$filename);
        }

        clearstatcache();

        $size = (float) sprintf("%u", filesize($filename));
        if ($size > MAX_OBJECT_SIZE) {
            throw new SyntaxException("File size exceeds maximum object size.");
        }

        $this->_guess_content_type($filename);

        $this->write($fp, $size, $verify);
        fclose($fp);
        return True;
    }

Я смотрел на это в течение нескольких часов и не могу понять, что происходит не так. Кстати, никаких ошибок php не видно, только одна ошибка, указанная выше. Новичок в Stack Overflow (частый браузер, новая учетная запись), поэтому заранее спасибо за вашу помощь.


person quicksand    schedule 11.10.2012    source источник


Ответы (1)


Я не думаю, что вы понимаете, как работает массив $_FILES. После загрузки файл находится по адресу $_FILES['userfile']['tmp_name'] и не имеет исходного имени.

Если вы хотите, чтобы файл был загружен с оригинальным именем, вам нужно будет сделать что-то вроде:

public function add_local_file()
{
    $file_location = '/tmp/';
    $file_name     = $_FILES['userfile']['name'];

    if(move_uploaded_file($_FILES['userfile']['tmp_name'], $file_location . $file_name)){

        $this->cfiles->do_object('a', $file_name, $file_location);

    }

    $this->_show_errors('Image Added!');
}
person keithhatfield    schedule 11.10.2012
comment
Спасибо. Этот ответ отлично работает для меня. Я не понимал, что имя файла меняется с массивом $_FILES. У меня недостаточно представителей, чтобы проголосовать за, но я принял ваш ответ (я вернусь, чтобы проголосовать, как только мой представитель станет > 15). Я скажу так: программирование унизительно! - person quicksand; 11.10.2012