Autor Zpráva
6xx
Profil *
Ahoj,
snažím se ukládat obrázky do DB, odeslané obrázky se sice uloží, ale dle všeho se "něco" v nich změní a už nejdou zobrazit. Pokud jsem ten samý obrázek uložil pomocí phpMyAdmin, následné zobrazení funguje bezvadně.

Databáze má takovouto strukturu:

id SMALLINT UNSIGNED NOT NULL
photo_mime TINYTEXT","map_mime TINYTEXT
photo_size VARCHAR(50)
photo MEDIUMBLOB NULL
PRIMARY KEY (id)


Obrázek odesílá tento skriptík (příslušná část):

if (is_uploaded_file($_FILES["photo"]["tmp_name"])){
$photo = addslashes(fread(fopen($_FILES["photo"]["tmp_name"], "rb"), $_FILES["photo"]["size"]));
$bin_values = ",'".$_FILES["photo"]["type"]."','".$_FILES["photo"]["size"]."','$phot o'";
$bin_fields = ",photo_mime,photo_size,photo";
}
$DB->putRecord("minerals_bin_data","__ACTUAL__","'".$_POST["number"]."'".$bin_values,"id".$bin_fields);


funkci putRecord mám definovanou jinde jako (mimochodem tak funguje bezproblémově, ověřeno dlouhodobějším používáním), zkráceno:

function putRecord($tableName,$database,$values,$fields){
if ($database=="__ACTUAL__"){
$this->selectDB($this->actualDB);
}
mysql_query("INSERT INTO $tableName ($fields) VALUES (".$values.")");


Zobrazení funguje následovně:

$bin_data = $DB->viewRecord("minerals_bin_data","__ACTUAL__","photo_mime,photo_siz e,photo",0,"id='".$_GET["id"]."'");

header("Content-type: ".$bin_data[0]["photo_mime"]);
header("Content-length: ".$bin_data[0]["photo_size"]);
header("Content-Disposition: inline");
echo $bin_data[0]["photo"];
exit;


implementaci viewRecord rozepisovat nebudu, funguje (podobně jako putRecord) dobře a je na takřka 90 řádků.

Dump databáze, prvni záznam je odeslán pomocí mého skriptu, druhý pomocí phpMyAdmin. První záznam je viditelně kratší a poměrně značně rozdílný oproti tomu "správnému":
SQL soubor s tabulkou

testovací soubor:
testovací JFIF soubor

Už jsem (bezvýsledně) zkoušel použít místo addslashes() funkci mysql_real_escape_string(), převod pomocí bin2hex (včetně dodatečného přidání 0x na začátek i zpětné konverze pomocí pack()). Nerad bych používal base64encode() nebo něco podobného, co takhle nabobtná, protože je IMHO prasárna převádět obrázek do textu.
Jakékoliv nakopnutí k uspěšnému výsledku bude s radostí uvítáno.
nightfish
Profil
kolik problémů by ubylo, kdyby lidé neukládali binární data do databáze, nýbrž do souborů :-)

když si hned po uploadu dáš
echo $photo;
(po odstranění addslashes a s patřičnou hlavičkou), tak to obrázek vykreslí správně?
6xx
Profil *
To se ještě vykreslí správně
6xx
Profil *
Došel jsem k částečnému řešení problému. Ještě jednou jsem prozkoumal jak daný obrázek odesílá phpMyAdmin. Odesílá ho jako hexadecimální včetně 0x sekvence na začátku. Znova jsem tedy zkusil použít funkci bin2hex a fungovalo to. Problém je v tom, že v případě většího obrázku se nevloží nic (a proto jsem si myslel, že to nejde), ale s tím už se snad poperu sám.

OT: nightfish je nějaká narážka na nightwish nebo náhoda?
6xx
Profil *
Problém vyřešen kompletně. Tady bych chtěl všechny upozornit:
Jestli se pokoušíte nacpat větší datový objem do mysql a nic se nevloží a mysql_querry nevrací! FALSE, s největší pravděpodobností jde o chybu 1153. Stačí nastavit větší hodnotu max_allowed_packet v /etc/my.cnf. Zvláštní je, že v případě menších* souborů mysql správně vrátí chybu č. 1153.

*Když jsem uploadoval soubor s velikostí ca. 850 KiB, chyba se nevypsala, u souboru s velikostí okolo 500 KiB už ano.
jana.girl
Profil *
Dobrý den, řeším také problém s vkládáním obrázků do databáze. Vkládání mám tedy už vyřešené, ale se zobrazením obrázků mám problémy. Bohužel nemohu to vyřešit zmíněným způsobem - upload na server, jelikož je to školní úkol, a je tam zadáno, že data se mají ukládat do databáze.

Problém je v tom, že po vypsání obrázku z databáze mi to vypíše pouze nesmyslné znaky. Hlavičky mám nastavené a myslím že i dobře ;-). Moc prosím o pomoc, určo bude zádrhel v nějaké funkci, ale protože jsem s tím nehla, zkouším to vyřešit přes fórum.

Do datábáze vkládám obr GIF - velikost 8B.


$fileName = $_FILES['foto']['name'];
$tmpName = $_FILES['foto']['tmp_name'];
$fileSize = $_FILES['foto']['size'];
$fileType = $_FILES['foto']['type'];

$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = base64_encode(addslashes($content));
fclose($fp);

$fileName = addslashes($fileName);

$prikaz=MySQL_Query("INSERT INTO foto (foto) VALUES ( '$fileName')");

if (!$prikaz)
{
echo "Došlo k chybě při ukládání dat.";
}
else
{
echo "Data byla úspěšně uložena<br><br>";

}

Stránka vypíše - Data byla úspěšně uložena. A v databázi se zobrazí nová položka.

header("Content-Type: image/gif");

$id=$_GET["foto"];
$sql = "SELECT foto
FROM foto
WHERE id = $id";

$vysledek_sql = mysql_query($sql);

$data = mysql_fetch_assoc($vysledek_sql);


echo base64_decode($data["foto"]);
?>

Po tomto vypsání obrázku se zobrazí : ěçÎű†
Hlavičku mám uloženou uplně na záčku html kódu.

Nevíte náhodou v čem mám chybu.
Děkuji za pomoc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: