Как установить header () и отобразить изображение с помощью CodeIgniter? - PullRequest
2 голосов
/ 29 ноября 2009

Я написал метод для установки header () для соответствующего типа файла загрузки, сохраненной в базе данных, и затем я хотел бы повторить () файл.

Метод заключается в следующем внутри контроллера:

function view_upload( $id = 0 ) {

    $id = $this->db->escape( $id );

    $query = $this->db->query( "SELECT file_type FROM media WHERE id = $id" )->row();
    $query2 = $this->db->query( "SELECT file FROM media WHERE id = $id" )->row();       

    header("Content-type: ".$query->file_type);
    //die( "moo" );
    echo( $query2->file );
}

Странно, но как только я установил header (), остальная часть метода, кажется, игнорируется, например, если я раскомментирую оператор die (), он не умирает и не отображает изображение. Если я удаляю вызов header (), я вижу необработанный шарик загрузки, представленный на экране.

Это как-то связано с CodeIgniter или я допустил ошибку PHP?

EDIT:

Я изменил функцию и поместил ее в отдельный файл вне CodeIgniter, но если я просматриваю его и передаю $ id, он все равно не отображает изображение ...

<?php
// just so we know it is broken
error_reporting(E_ALL);
// some basic sanity checks
if(isset($_GET['id']) && is_numeric($_GET['id'])) {
    //connect to the db
    $link = mysql_connect("localhost", "user", "pass") or die("Could not connect: " . mysql_error());

    // select our database
    mysql_select_db("database") or die(mysql_error());

    $id = $_GET['id'];

    // get the file from the db
    $sql = "SELECT file FROM media WHERE id=$id";
    // the result of the query
    $result = mysql_query("$sql") or die("Invalid query: " . mysql_error());

    // get the file_type from the db
    $sql = "SELECT file_type FROM media WHERE id=$id";
    // the result of the query
    $result2 = mysql_query("$sql") or die("Invalid query: " . mysql_error());

    // set the header for the image
    //ob_clean();
    //die( mysql_result($result, 0) );
    //header('Content-type:'.mysql_result($result2, 0));
    header('Content-type: image/png');
    //ob_clean();
    echo mysql_result($result, 0);

    // close the db link
    mysql_close($link);
}
else {
    echo 'Please use a real id number';
}
?>

die () с результатом $ 2 дает то, что я ожидал, но он не отображает страницу в браузере. Опять же, если я добавлю ob_clean (), он скажет:

ob_clean() [<a href='ref.outcontrol'>ref.outcontrol</a>]: failed to delete buffer. No buffer to delete.

Я скопировал код отсюда: http://www.phpriot.com/articles/images-in-mysql/8, если это вообще поможет ..

Ответы [ 2 ]

1 голос
/ 10 декабря 2009

Сначала вы должны запустить ob_start () непосредственно перед on_clean (), затем вам нужно написать как header (). Вот следующее.

ob_start (); ob_clean (); заголовок ("Content-type: image / png");

?> Попробуйте это, дайте мне знать, работает это или нет, надеюсь, это поможет вам.

1 голос
/ 29 ноября 2009

Оказывается, что изображение в базе данных было повреждено, и, следовательно, не отображалось, потому что я добавил addlashes () к содержимому файла (не совсем уверен, почему, кажется, помните, что чтение было полезно в борьбе с уязвимостями XSS).

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

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