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
- 2613 megtekintés
Hozzászólások
Szerintem ez a baj:
$filecontent =addslashes($filecontent);
Helyette hasznalj inkabb mysql_real_escape_string fuggvenyt.
- A hozzászóláshoz be kell jelentkezni
mysql_real_escape_string --- viszont ezt még nem . Próbálom.
- A hozzászóláshoz be kell jelentkezni
+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!"
- A hozzászóláshoz be kell jelentkezni
Az ObjectPascal-t egyáltalán nem ismerem.
és
$filecontent=mysql_real_escape_string($filecontent);
nem jött be.
- A hozzászóláshoz be kell jelentkezni
Nincs több ötlet? -:(
- A hozzászóláshoz be kell jelentkezni
Mennie kéne. Esetleg charset problémád lehet, csatlakozás után állítsd be "set charset"-el ugyanarra lementéskor, és kiolvasáskor is. Nekem is kellett sql-ben tárolni képeket, nem volt vele baj.
- A hozzászóláshoz be kell jelentkezni
Eh. BLOB a mező típusa.
- A hozzászóláshoz be kell jelentkezni
szia, ellenőrizd a header-ket firebug-al, a Content-type-ot mindenkép.
- A hozzászóláshoz be kell jelentkezni
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!"
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
És az adatbázisba mentett méret az jó? Mert amíg az nem stimmel, addig kár kínlódni mással.
- A hozzászóláshoz be kell jelentkezni
Az se jó. Az már megegyezik a letöltöttel.
Valahol a feltöltéskor romlik el.
- A hozzászóláshoz be kell jelentkezni
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";
- A hozzászóláshoz be kell jelentkezni
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!!!
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 hozzászóláshoz be kell jelentkezni
Érdekes.
Csinálok egy szűz szervert, hátha valami szerver oldali paraméter nem felel meg.
- A hozzászóláshoz be kell jelentkezni
Nos. Szűz szerveren, újra begépelve a programot, az adatbázist is újra generálva, működik.
A számítástechnika ördöge is dolgozik.
- A hozzászóláshoz be kell jelentkezni
http://vimeo.com/8580584 5:58-nál kezdődik a header vizsgálat bemutatása.
- A hozzászóláshoz be kell jelentkezni
"http://vimeo.com/8580584 5:58-nál kezdődik a header vizsgálat bemutatása."
Ezt csak otthon tudom megnézni. Innen nem engedélyezett.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni