MySQL-PHP-longblob-kepek

Sziasztok!

Kényszerből a képeket adatbázisban kell tárolnom.
Lekérdezéskor viszont nem tudom megjeleníteni. Hibás, sérült fájlként ismeri fel. Ha az adatbázisba Myadmin felületen közvetlenül viszem be a képet, akkor gond nélkül ki tudom olvasni, és megjeleníteni. A megjelenítést kétféleképpen is próbáltam: közvetlenül (header ...) megjeleníteni, illetve adatbázisból kiolvasás után fájlba kiírtam, majd onnan megjeleníteni.
Olyannak tűnik a hiba, mintha a képfájlok (jpg) metaadatai nem töltődnének be a longblob mezőbe. (Ez csak tipp.)
Mellékelném a programot. Ez kétfájl, az egyik egy sima form, a másik az, amelyik feldolgozza az adatokat. Ez a fájl a feldolgozás után ki is olvassa az adatbázisból a képet, és próbálná megjeleníteni.Sikertelenül. Volt olyan eset, hogy Firefox-l megjelent a kép, de Chrome-l illetve IE-vel soha nem jelent meg.

( A beküldés előtt megnéztem az előnézetet, és a tag (csibecsőrök) jelek nem jelentek meg. Ezért ezeket kitöröltem innen. )

Beolvasás:

<?php

require('fuggvenyek.php');
print ("body bgcolor=\"#dce8cf\" ");

# file feltoltes

print "br File feltöltése br";

print "form enctype=\"multipart/form-data\" action=\"proba-1.php\" method=\"post\" ";
print "Tölts fel egy képet magadról";
print "input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"2048000\" ";
print "input type=\"file\" name=\"arckepe\" ";
print "input type=\"submit\" name=\"Tovabb\" value=\"Tovább\" ";
print "input type=\"reset\" name=\"Alaphelyzet\" value=\"Alaphelyzet\" ";
print "/form";

?>

Adatbázisba rögzítés, kiolvasás, megjelenítés:

<?php

# hivo : buvar.php

require('fuggvenyek.php'); # adatbazis megnyitas
print ("body bgcolor=\"#dce8cf\" ");

$FileName =addslashes($_FILES['arckepe']['name']);
$filesize =$_FILES['arckepe']['size'];
$filetype =$_FILES['arckepe']['type'];
$filecontent =file_get_contents($_FILES['arckepe']['tmp_name']);
$filecontent =addslashes($filecontent);

$sql="insert into proba (name, type, size, content) values ('$FileName', '$filetype', '$filesize', '$filecontent') ";
$success=mysql_query($sql) or die ("Nem sikerült az insert
" .mysql_error() ."
" .mysql_errno() );

# file letoltese

$sql="select name, type, size, content from proba where id='1' ";
$result=mysql_query($sql) or die ("Nem sikerult a select");

list ($name, $type, $size, $content) = mysql_fetch_array($result);

#header("Content-length: $size");
#header("Content-type: $type");
#header("Content-Disposition: attachment; filename=$name");
#echo $content;
#exit;

$ut="kepek/".$name;
file_put_contents("$ut", "$content") or die("
nem irtam a fajlba");

print "img widht=\"120\" height=\"90\" src= \"$ut\" /img";

?>

Segítségeteket előre is köszönöm
Gábor

Hozzászólások

Szerintem ez a baj:
$filecontent =addslashes($filecontent);

Helyette hasznalj inkabb mysql_real_escape_string fuggvenyt.

+1 mysql_real_escape_string

Igaz nem PHP-s de ObjectPascal (Delphi/Lazarus) kód a következő a ZeOS DB-ből:


      stAsciiStream, stUnicodeStream, stBinaryStream:
        begin
          TempBlob := DefVarManager.GetAsInterface(Value) as IZBlob;
          if not TempBlob.IsEmpty then
            Result := GetAnsiEscapeString(TempBlob.GetString)
          else
            Result := 'NULL';
        end;


....

function TZMySQLEmulatedPreparedStatement.GetAnsiEscapeString(const Value: AnsiString): AnsiString;
var
  BufferLen: Integer;
  Buffer: PAnsiChar;
begin
  BufferLen := Length(Value) * 2 + 1;
  GetMem(Buffer, BufferLen);
  if FHandle = nil then
    BufferLen := FPlainDriver.GetEscapeString(Buffer, PAnsiChar(Value), Length(Value))
   else
    BufferLen := FPlainDriver.GetRealEscapeString(FHandle, Buffer, PAnsiChar(Value), Length(Value));
  Result := '''' + BufferToStr(Buffer, BufferLen) + '''';
  FreeMem(Buffer);
end;


....


function TZMySQLBaseDriver.GetRealEscapeString(Handle: PZMySQLConnect; StrTo, StrFrom: PAnsiChar;
  Length: Cardinal): Cardinal;
begin
  Result := MYSQL_API.mysql_real_escape_string(Handle, StrTo, StrFrom, Length);
end;

Attila, Perger
-----------------------------------------------------
"Az a szoftver, amelyiket nem fejlesztik, az halott!"

szia, ellenőrizd a header-ket firebug-al, a Content-type-ot mindenkép.

Megnéztem, NE szövegként akard beolvasni a képfájlt:


string file_get_contents ( 
    string $filename 
    [, bool $use_include_path = false 
    [, resource $context 
    [, int $offset = -1 
    [, int $maxlen ]]]] )

This function is similar to file(), except that file_get_contents() returns the file in a string, starting at the specified offset up to maxlen bytes. On failure, file_get_contents() will return FALSE.

http://php.net/manual/en/function.readfile.php
http://php.net/manual/en/function.fread.php (fread — Binary-safe file read)

Nem vagyok egy PHP zseni de szerintem ezért nem működik!!!

Attila, Perger
-----------------------------------------------------
"Az a szoftver, amelyiket nem fejlesztik, az halott!"

Lecseréltem fread() -re . Ezzel sem működik. Az eredeti mérete a fájlnak: 412684
Adatbázisból visszaolvasva és fájlba téve: 643345

pim-nek

" ellenőrizd a header-ket firebug-al, a Content-type-ot mindenkép."

Ezt nem tudom hogyan kell csinálni. Adsz támpontot?
Habár nem értem, miért kell a content-t ellenőrizni. Ahogyan én gondolom, egy fájlt kéne binárisan tárolni módosítás nélkül az adatbázisban, majd onnan visszatenni módosítás nélkül fájlba. (Persze nem guru vagyok)

Csökkentettem a kódot, hogy minél egyszerűbb legyen:

require('fuggvenyek.php');
print ("body bgcolor=\"#dce8cf\"");

$FileName ="iza.jpg";
$filetype ="jpg";
$fp =fopen('kepek/iza.jpg','r');
$filesize =filesize('kepek/iza.jpg');
print "br mérete: $filesize br";
$filecontent =fread($fp,$filesize);
$filecontent = mysql_real_escape_string($filecontent) ;
$sql="insert into proba (name, type, size, content) values ('$FileName', '$filetype', '$filesize', '$filecontent') ";
$success=mysql_query($sql) or die ("Nem sikerült az insert
" .mysql_error() ."
" .mysql_errno() );

# file letoltese

$sql="select name, type, size, content from proba where id=(select max(id) from proba)";
$result=mysql_query($sql) or die ("Nem sikerult a select");

list ($name, $type, $size, $content2) = mysql_fetch_array($result);
$ut="kepek/".$name."as";
$content3=mysql_real_escape_string($content2);
file_put_contents("$ut", "$content3") or die("
nem irtam a fajlba");
print "br A kep neve: $ut"
."br img widht=\"120\" height=\"90\" src= \"$ut\" /img";

Sajnos nem értem miért nem működik... pedig a HELP (addslashes) az kéri használjuk "mysql_real_escape_string" függvényt azoknál az adatbázisoknál, ahol van "escape" fügvény a string-kezeléshez az "addslashes" helyett.

Ez itt egy sorozat a kérdéses részhez léptetve:

http://www.phpriot.com/articles/storing-images-in-mysql/7
Parameteres query-t használ!!!

De a példa nem ezt követi :-)

A következő BASE64 kódolással játszik, más rendszerrel visszaolvasásnál is alkalmazni kell a dekódolást:
http://www.mwasif.com/2007/4/save-image-in-mysql-with-php/

üdv.

Attila, Perger
-----------------------------------------------------
"Az a szoftver, amelyiket nem fejlesztik, az halott!"

a content disposition meg legyen inline, mert az attachment felajánlódik letöltődésre :)

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Ha minden kötél szakad, akkor próbáld meg a kép adatokat lekódolni és úgy letárolni. Bár ez hely és erőforrás igényes, de működni fog.

arth2o: honlapkészítés