jarekpc
(Jarekpc)
September 12, 2013, 11:30am
1
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
Jak piszesz posta otaczaj kod tagami [ code ] [/ code ].
W kolumnie image zapisujesz tak na prawdę nazwe pliku, obiekt CUploadedFile zostanie zrzutowany i zwróci nazwę pliku.
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.
jarekpc
(Jarekpc)
September 12, 2013, 4:22pm
3
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.
jarekpc
(Jarekpc)
September 13, 2013, 8:13am
5
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
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'/>"; ?>