Obrazek W Widoku?

Witam,

Mam tabelkę tbl_image o kolumnach

CREATE TABLE tbl_image(

id INTEGER NOT NULL AUTO_INCREMENT,

file_name varchar(100) NOT NULL,

file_type varchar(10) NOT NULL,

file_size INTEGER NOT NULL,

file_content TEXT not null,

image blob NOT NULL,

PRIMARY KEY(id)

)ENGINE=InnoDB

wypełniam ją korzystając z metody actionCreate():

if (isset($_POST[‘Image’])) {

        $model->attributes = $_POST['Image'];


        if (!empty($_FILES['Image']['tmp_name']['image'])) {


            $file = CUploadedFile::getInstance($model, 'image');


            $model->file_name = $file->name;


            $model->file_type = $file->type;


            $model->file_size = $file->size;


            $fp = fopen($file->tempName, 'r'); 


            $model->file_content = file_get_contents($file->tempName);


            $model->image = $file;


            


        }


        if ($model->save()) 


            $this->redirect(array('view', 'id' => $model->id));

i metoda do wyswietlenia:

public function actionWyswietla($id = ‘’) {

    $model = Image::model()->findByPk($id);


    header('Content-Type: ' . $model->file_type);


    echo $model->file_content;   


}

baza jest wypełniana zdjęciami ale podglądu obrazku na stronie nie widać, mime-type własciwy image/jpeg zawartośc blob kolumny image również jest wypełniony a zdjecia nie widać(zmieniłem echo $model->file_content na echo $model->image ale i to nie pomogło). Jak rozwiązać ten problem?

Pozdrawiam

Jarek

  1. Jak piszesz posta otaczaj kod tagami [ code ] [/ code ].

  2. W kolumnie image zapisujesz tak na prawdę nazwe pliku, obiekt CUploadedFile zostanie zrzutowany i zwróci nazwę pliku.

  3. Otwierasz plik ale nie używasz zmiennej $fp. Funkcja file_get_contents tego nie potrzebuje.

Poza tym wyświetlanie wygląda ok. Spróbuj po otwarciu tej strony zapisać ją jako plik i zobaczyć, czy w środku będą dane binarne obrazka.

Zmieniłem metodę


 

public function actionCreate() {

        $model = new Image;


        if (isset($_POST['Image'])) {

            $model->attributes = $_POST['Image'];            

            if (!empty($_FILES['Image']['tmp_name']['image'])) {

                $file = CUploadedFile::getInstance($model, 'image');                

                $model->file_name = $file->name;

                $model->file_type = $file->type;

                $model->file_size = $file->size;

                $fp = fopen($file->tempName, 'r'); 

                $content = fread($fp, filesize($file->tempName));

                fclose($fp);

                $model->file_content = $content;                

                $model->image = $file;

            }


            if ($model->save()) 

                $this->redirect(array('view', 'id' => $model->id));                      

        }


        $this->render('create', array(

            'model' => $model,

        ));

    }




w modelu sprawdziłem rules()




array('file_content', 'file', 'types'=>'jpg, gif, png, bmp, jpeg','allowEmpty' => true)



zapisałem dane w bazie oraz pobrałem zdjęcie z bazy(zapis binarny jest ok).Tylko ze widoku mam krzaki zamiast zdjecia(coś takiego:’ ????JFIF``??-ExifMM*a2…’) Mime:(image/jpeg) a drukowana jest wartość z file_content w formie string.a z kolei w kolumnie image mam wartość blob. Macie jakieś pomysły jak poprawnie wyświetlić zawartość zdjecia?

Wygląda na to, że obrazek wysyła się do przeglądarki prawidłowo, brakuje tylko właśnie content-type. Wiem, że wysyłasz taki nagłówek, tak czy inaczej przeglądarka go nie odbiera. Zobacz może co się ładuje w Firebugu. W tagu img obrazek będzie się wyświetlał, bo przeglądarki dość dobrze odgadują mime-type jeśli nie został podany.

Niekoniecznie w widoku wyświetla się zdjęcie, próbuje takiej konstrukcji ale nie mam zdjęcia wyskakują krzaki:




<?php echo "<img src='image/jpeg" .$data->file_content."' width='100' height='90'/>"; ?>



a cały widok:




<?php

/* @var $this ImageController */

/* @var $data Image */


?>


<div class="view">


	<b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>

	<?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id)); ?>

	<br />


	<b><?php echo CHtml::encode($data->getAttributeLabel('file_name')); ?>:</b>

	<?php echo CHtml::encode($data->file_name); ?>

	<br />


	<b><?php echo CHtml::encode($data->getAttributeLabel('file_type')); ?>:</b>

	<?php echo CHtml::encode($data->file_type); ?>

	<br />


	<b><?php echo CHtml::encode($data->getAttributeLabel('file_size')); ?>:</b>

	<?php echo CHtml::encode($data->file_size); ?>

	<br />


	<b><?php echo CHtml::encode($data->getAttributeLabel('file_content')); ?>:</b>	

	<br />

        

        <?php

     

        echo "<img src='image/jpeg" .$data->file_content."' width='100' height='90'/>"; ?>

        

	<br />

        


</div>



Bo wstawiasz dane binarne do HTML :slight_smile:

W tagu ‘img’ podaj w atrybucie ‘src’ URL prowadzący do akcji, która wyświetla obrazek wypluwając dane binarne z bazy z odpowiednim nagłówkiem ‘Content-Type’:




<?php echo "<img src='" .$this->createUrl('wyswietla',array('id'=>$data->id))."' width='100' height='90'/>"; ?>



albo taki trik:




<?php echo "<img src='data:image/jpeg;base64," .base64_encode($data->file_content)."' width='100' height='90'/>"; ?>