Yii Framework Forum: Obrazek W Widoku? - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Obrazek W Widoku? Rate Topic: -----

#1 User is offline   Jarek 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 35
  • Joined: 06-May 13

Posted 12 September 2013 - 06:30 AM

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
0

#2 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 12 September 2013 - 08:19 AM

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.
Don't be a dick.
0

#3 User is offline   Jarek 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 35
  • Joined: 06-May 13

Posted 12 September 2013 - 11:22 AM

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*2...') 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?
0

#4 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 12 September 2013 - 11:43 AM

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.
Don't be a dick.
0

#5 User is offline   Jarek 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 35
  • Joined: 06-May 13

Posted 13 September 2013 - 03:13 AM

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>

0

#6 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 13 September 2013 - 04:19 AM

Bo wstawiasz dane binarne do HTML :-)

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'/>"; ?>

Don't be a dick.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users