|
Posted by Jerry Stuckle on 12/27/06 01:06
hackajar@gmail.com wrote:
>>Hello Members,
>>
>>I am setting up a photo website. I have decided to use PHP and MySQL.
>>I can load jpeg files into the table (medium blob, or even longtext)
>>and get the image(s) to display without a problem. I am using
>>chunk_split(data) and the base64_encode and base64_decode on the files.
>>
>>I do a select from the database, and then echo the image (with
>>header(Content Type: image/jpeg)
>>and the decoded image displays fine. Yes, I have tried header(Content
>>Type: image/png), without
>>success.
>>
>>My problem is png images. Is there something that I need to do
>>different in terms on reading/encodeing/decodeing the png image? I am
>>putting its "binary" data into the db table.
>>But when I do a select on a png image - it never displays in the
>>browser.
>>
>>I am not using file/path names as references, but actually putting the
>>image in the db.
>>
>>Here is a sample of code I use to insert the data into the table, and
>>to select the code from the table.
>>
>>load image(s):
>><?php
>>while ($file = readdir($dir_handle))
>>{
>>$filetyp = substr($file, -3);
>>if ($filetyp == 'png' OR $filetyp == 'jpg')
>>{
>>$handle = fopen($path . "/" . $file,'r');
>>$file_content = fread($handle,filesize($path . "/" . $file));
>>fclose($handle);
>>
>>$encoded = chunk_split(base64_encode($file_content));
>>$sql = "INSERT INTO images SET sixfourdata='$encoded'";
>> mysql_query($sql);
>>}
>>}
>>?>
>>
>>display images:
>>
>><?php
>>$result = @mysql_query("SELECT * FROM images WHERE id=" . $img . "");
>>
>>if (!$result)
>>{
>>echo("Error performing query: " . mysql_error() . "");
>>exit();
>>}
>>
>>while ( $row = mysql_fetch_array($result) )
>>{
>>$imgid = $row["id"];
>>$encodeddata = $row["sixfourdata"];
>>}
>>?>
>>
>><?php
>>//echo base64_decode($encodeddata);
>> echo $encodeddata;
>>?>
>>
>>This process seems to always work with jpegs.
>>
>>Thanks
>>
>>ewholz
>
>
> Code to Import images , with HTML goodness
>
> ===SNIP START===
> <table>
> <tr>
> <td Colspan="2"><h3>Insert Image</h3></td>
> </tr>
> <tr><form method="post" ENCTYPE="multipart/form-data" name="theForm">
> <td>Image File</td>
> <td><input type=file size="40" name=image></td>
> </tr>
> <tr>
> <td colspan="2" align="center"><input type="submit"
> value="Upload"></td>
> </tr>
> </form>
> </table>
> <?php
> if(!$_FILES)die();
> require_once('./pathtodatabaseconnect.php');
>
> $iname = $_FILES['image']['name'];
>
> //Suck that file into a buffer
> ob_start();
> $contents = readfile($_FILES['image']['tmp_name']);
> $dump = ob_get_contents();
> ob_end_clean();
>
>
> $data = unpack("H*hex", $dump);
> $buf = $data['hex'];
>
> //Check to see what we got it the dB already
> $query = "select id from $database.imagetable where id = '$iname'";
> $result = mysql_query($query) or die();
> $line = mssql_fetch_array($result);
>
> if($line == "") {
> $query = "insert into $database.imagestable (id, data) values
> ('$iname', 0x$buf)";
> $status = "inserted into";
> } else {
> $query = "UPDATE $database.robert.imagetable set data = 0x$buf where
> id = '$iname'";
> $status = "updated in";
> }
> mysql_query($query) or die("error during query: $query");
>
> ?>
> <dd>Image was <?echo $status;?> database
> <dd>Image Uploaded
> <dd><img src="GetImage.php?image=<?=$iname;?>">
>
> </body>
> </html>
> ===SNIP END===
>
> Code to read images to screen
>
> NOTE: This code is expecting to be called from an IMG tag: <img
> src="phpfile.php?image=1">
> ===SNIP START===
> <?php
> require_once('./pathtodatabaseconnect.php');
Include a type calumn
> function getImage($data) {
> if(substr($data, 0, 3) == "GIF") return "gif";
> if(substr($data, 0, 2) == "BM") return "bitmap";
> if(substr($data, 6, 4) == "JFIF") return "jpeg";
> if(substr($data, 1, 3) == "PNG") return "png";
> if(substr($data, 0, 2) == "II" || substr($data, 0, 2) == "MM") return
> "tiff";
> return 1;
> }
> extract($_GET);
> $query = "SELECT data from $database.imagetable where id = '$image'";
> $result = mysql_query($query) or die();
> $data = mysql_result($result,0);
> $len = strlen($data);
> $type = getImage($data);
> header("Content-type: $type");
> header("Content-length: $len");
> echo $data;
> ?>
> ===SNIP END===
>
> NOTE: Loading images from a dB is really lame! I tried this (as above
> code shows) and while it does work, it is extreamly slow and taxing on
> your server unessecarly. I would suggest have a directory called
> "images" and having a list of that directory in the database, that
> would be much faster!
>
> Example:
> ===SNIP START===
> <img src="getImage.php?image=1">
> <?php //this is are fake "getImage.php" file ;)
> require_once('pathtodatabasefile.php');
> function getImage($data) {
> if(substr($data, 0, 3) == "GIF") return "gif";
> if(substr($data, 0, 2) == "BM") return "bitmap";
> if(substr($data, 6, 4) == "JFIF") return "jpeg";
> if(substr($data, 1, 3) == "PNG") return "png";
> if(substr($data, 0, 2) == "II" || substr($data, 0, 2) == "MM") return
> "tiff";
> return 1;
> }
> $query="SELECT name from $database.imagetable WHERE value =
> ".$_GET['image'].";";
> $name = mysql_result(mysql_query($query),0);
> $buf=readfile("./images/$name");
> $len=strlen($buf);
> $type=getImage($buf);
> header("Content-type: $type");
> header("Content-length: $len");
> echo $buf;
> ===SNIP END===
>
> Wow, hope you can digest all that!
>
> Cheers,
> hackajar (at not spam, please don't spam) gmail (PLEASE NO SPAM) com
> eholz1 wrote:
>
(Top posting fixed)
It was probably slow becasue your code is so inefficient.
Some suggestions:
1. Include the type of file as a column of the table.
2. Include the length as another column.
3. Don't use file names. Rather, use an autoincrement column for an id.
Make that id the primary key and load the image by id.
4. There is no need to use ob_start/ob_end_clean. Rather, fopen() the
file (in binary mode) and fread() it into the buffer.
These changes will speed things up a lot.
Also, your content-type is incorrect. It should be "image/gif",
"image/bitmap", etc.
I use images from a database all the time, and they work fine. They
also have the advantage that if you're using innodb tables, you can
guarantee the integrity of the database (what happens if an image file
is deleted, for instance?)
P.S. Please don't top post.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Navigation:
[Reply to this message]
|