what I need to do in my website is to show a list of jpg images stored in a Mysql database using Blob type (I don't want to use any other way). but instead of the image I got strings like this
����$ExifMM*bj(1r2��i��SI'SI'Adobe Photoshop CS6 (Windows)2014:07:31 20:02:56�����&(."�HH����XICC_PROFILEHLinomntrRGB XYZ � 1acspMSFTIEC sRGB���-HP cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ#dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<�gTRC<�bTRC<�textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L.....
This is the code...
<?php
// Create connection
$con=mysqli_connect("erossenses#localhost","erossenses","-----","my_erossenses");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT * FROM Racconti");
echo "<br>";
echo "<font style=\"font-family:Verdana; font-size:15px; color:maroon\"><b><u>Titolo</u></b></font>";
echo "<br>";
echo "<br>";
header('Content-type: image/jpeg');
while($row = mysqli_fetch_array($result)) {
echo $row['Immagine'];
echo "<br>";
}
mysqli_close($con);
?>
Where am I wrong?
You can't generate multiple images with php at once. you can only do them one at a time, so you'd have to do it via ajax. this isn't advisable at all anyway. you're best to learn about ajax and file uploads and how to secure them than wasting any more time on this. Storing images in mysql is suicide, especially for a beginner. You are on the wrong path and learning dangerous habits already.
to advance your skills, read the manual http://php.net/ or better yet, get a quality php book.
Try the below code
header("Content-length: $fileSize"); header("Content-type: $fileType"); header("Content-disposition: download; filename=$fileName"); echo $fileData;
Hope file size,name, type, and data stored in table.
The problem is you're echoing a lot of stuff that's not an image. If you set header('Content-type: image/jpeg'); the browser will expect to get only the image data (for just one image).
If you really must use images from the database, a solution would be to create an additional file, let's say image.php?id=1 which gets the id of the image and displays only that specific image. You can use this file in the src of an img tag.
Related
I am able to retrieve single image from mysql database using php.
Now I want to retrieve multiple images.
Here is the piece of code:
<?php
--db connection code--
$sql = "SELECT image FROM try WHERE status='0'";
$result = mysql_query("$sql") or die("Invalid query: " . mysql_error());
while ($row = #mysql_fetch_assoc($result))
{
// set the header for the image
header("Content-type: image/jpeg");
echo mysql_result($result, 0);
echo '<br>';
}
?>
executing this code, only first image in table is being displayed.
How to retrieve multiple images?
You are using Content-type: image/jpeg, which means it can only return one image, as the browser will only expect one. If you want to return multiple images to download you have to do some workaround.
One option would be to first pack the files together into one file (like a ZIP archive), and push that to the user.
Or if you don't want to push this as a download, then create a HTML page, with image links to your images. Each of the link will only return one of course.
You need to pass the loop counter in result_mysql
$count=0;
while ($row = #mysql_fetch_assoc($result))
{
// set the header for the image
header("Content-type: image/jpeg");
echo mysql_result($result,$count);
$count++;
}
Please don't use the error suppressor #
mysql_result
NOTE : Please don't use mysql* functions in your new code they are
depriciated in newer versions use mysqli* or PDO
As the Content-type: image/jpeg returns only a single image, you should consider saving the paths of the images in your database table. Later on you won't have any problems fetching all of them and echoing the source elements in your html.
I've create a table where I've saved images through "BLOB". I need to show those images along with other items. But I don't know how to show those images together in the same page.
Here's my php code that displays other things in form of a table. Similarily, I wanted to display images accordingly. Any help?
<?php
$display_query = mysql_query("SELECT * FROM eportal");
echo "<table id='pageTable'><thead><tr><th>Item code</th><th>Description</th><th>Cost</th></tr></thead>";
echo "<tbody>";
while($row = mysql_fetch_array($display_query)){
print "<tr><td>".$row['itemid']."</td><td>".$row['description']."</td><td>";
print "₹".$row['cost']."</td></tr>";
}
echo "</tbody>";
echo "</table>";
mysql_close($connection);
?>
Saving images to the DB is not a good idea but if You think You need to it this way, then You can retrieve the data from DB table, encode it to base64 (http://php.net/base64_encode) and then in HTML print it in this way:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
Using PHP You would write:
echo '<img src="data:'.$image_mime_type.';base64,'.base64_encode($image_data_from_db).'" alt="My image alt" />';
As other people mentioned, storing the images in the database is usually a bad idea.
Images are not transmitted in the same HTTP response with another page data.
To show images from the database, you would need to implement a script which, given the item id, would read the field and send the image's binary data; and provide the path to the script in your form's <img src="">:
while($row = mysql_fetch_array($display_query)){
print "<tr><td>".$row['itemid']."</td><td>".$row['description']."</td><td>";
print "₹".$row['cost']."</td><td>";
print "<img src=\"image.php?id=".$row['id']."\"></td></tr>";
}
image.php is another script which outputs the value of image_blob given the eportal.id. You would also need to provide correct size and mime type in the headers.
You better just store the images in a file (accessible by the web server) and store the path fo the file in the database.
Read the Blob data and write it into the file with header type image.. and try to print it, It should display the image file.
And yes saving image or any file in DB is really a bad habit as you are increasing DB size and it slowdown the performance also.. I suggest you to just try to convert you Blob into Image but don't apply in your work. Just save the image at desired location and keep its location path into DB to fetch and save next time.
The debate of storing blobs versus storing a path to the image file on disk has been debated over and over again. Microsoft provides a research paper comparing the pros and cons of each here. With that said, to display a blob as an image you need to make a call to a separate page and output header information that tells the browser what type of image is stored.
For example:
connectToDatabase();
$sql = "SELECT image_blob FROM eportal;";
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($result);
header("Content-type: image/jpeg");
echo $row['image_blob'];
$db->close();
In case you still want to save your images in database, you will need second script which will get those images from database and pass them to browser with correct headers.
header("Content-type: image/jpeg");
#
# Replace this with database read:
# readfile('myimage.jpg');
Also, you will need to store what kind of image u use. There will be different header for JPEG, GIF or PNG file.
/*this code is working(echoing image) on localhost but not displaying on live site */
PLEASE HELP,,,,
<?php echo "<img src=geti/tipb_geti.php?id=$lastid width=200px height=180px >";
/*this below php block is tipb_geti.php file*/
<?php
include("connect.php");
$id=#addslashes($_REQUEST['id']);
$image_query=#mysql_query("select image from tipuranibasti where id=$id");
$image_row=#mysql_fetch_assoc($image_query);
$image=$image_row['image'];
header("content-type: image/jpeg");
echo $image;
?>
What's the memory limit on your live server? You're making TWO copies of the image data here:
$image=$image_row['image'];
which is utterly pointless. You could simply have
echo $image_row['image'];
instead and save yourself the extra wasteful/pointless copy operation.
Check if your characterencodigs. The livedb might have got UTF8 ancoding or the server has, but you not, if not, what is the output? Comment out header("content-type: image/jpeg"); and check if you get the same things live and local.
oh and i would prefer:
<?php print'<img src="geti/tipb_geti.php?id=' . $lastid . '" width="200px" height="180px" />';
makes your html/xhtml a bit more well formatted and print'test'; is slightly faster than print"test"; since "$var" will output the content of $var and '$var' wont, this is a little less overheat. But don't think you gain hyperspeed from that :P You won'T notice the bit more performance, I only think it provides a better code.
I stored it images in the database using an BLOB field (I'm using SQLite). Now I want to recover this image to a HTML page and show the images there.
I can retrieve the binary data from the image from the database, but what I can do to transform this data in an image and show in the page? Currently I want to show the images inside a field in a table.
You could abuse the data: protocol, but trust me, you don't want that if you can avoid it. Normally, you create a separate php-script that serves images, so in script 1:
<img src="/myimagescript.php?id=1234">
In myimagescript.php:
//get the data from the database somehow (mysql query et al.)
//let's assuma the data is in $data
header('Content-Type: image/jpeg');//alter for png/gif/etc.
echo $data;
#uscere90 is right, but an example might help (example of a PNG image):
<?php
header("Content-type: image/png");
echo $image_data;
?>
Typically this is done by creating a wrapper script or function that retrieves the BLOB and delivers it with the appropriate content headers to be used as an <img src=''>
Doing it this way also gives you the benefit of being able to deliver or not deliver the image based on other authentication factors determined by your PHP. If, for example, a user doesn't have permission to see an image, you can instead show some default or blocking image in its place.
// File getimg.php
// Retrieve the image blob specified by $_GET['imgid'] from the database
// Assuming your blob is now in the variable $image...
header("Content-type: image/jpeg");
// Just echo out the image data
echo $image;
exit();
Now in your html:
<img src='getimg.php?imgid=12345' alt='this is your img from the database' />
You can create a simple image.php page that queries your database, then prints out a content-type relevant to the image and vomits the binary data to screen. So, in your table, you'd have <img src=image.php?id=something />, and then you'd use that id in your image.php page to do your database lookup, retrieve the binary data, and print it to screen after printing the content-type header.
image.php:
<?php
header('Content-type: image/jpeg');
//DO SQL NINJA STUFF HERE
echo mysql_result($result,0,"file_content");
?>
There are two options I would say:
You create a script that returns the image data. The <img src="-field then calls that script.
You offer the data of the images directly via a data url.
Both have it's pros and cons. For the first solution you must create a new script for the images. The second method will bloat your page if the images are large.
As there are examples for the image script method already, here is some code fragment for data URIs:
<?php
function data_uri($content, $mime)
{
$base64 = base64_encode($content);
return ('data:' . $mime . ';base64,' . $base64);
}
?>
<img src="<?php echo data_uri($content,'image/png'); ?>" />
You need to set the mime-type according to your image, image/png for PNG images, image/jpeg for JPG files etc., see here for a list.
I'm trying to display multiple images using PHP and MySql database, even if using the while loop I don't get all of the images, I only get one, I mean the first one in the table. What's the problem ?
I'm using a table ID_IMAGE (int, pk, auto increment) and myImage (blob)
$query = mysql_query("SELECT myImage FROM image");
while($data=mysql_fetch_array($query)) {
header('Content-type: image/jpg');
echo $data['myImage'];
}
A possible way to solve this problem is to have a separate script to dynamically output the contents of the image eg. :
image.php
header('Content-type: image/jpg');
// DataBase query and processing here...
echo $data['myImage'];
and call it whenever you need to show images stored in your DB eg. inside your loop:
echo '<img src="image.php?id=' . $data['id'] . '">';
But storing images in the database will take a toll on your server and unless they're really small or you have a good reason to do so, you should only store their physical location on the disk.
You can also use this approach if you wish to hide image location from your users, or control access, but there are better and faster alternatives for that case.
Just to mention the possibility to embed the images directly in html by encoding them, you can use this:
$query = "SELECT myImage FROM image";
if ($result = mysqli_query($link, $query)) {
while ($row = mysqli_fetch_assoc($result)) {
echo '<img src="data:image/jpg;base64,' . base64_encode($row['myImage']) . '">';
}
}
Pro:
The browser does not need to load the images over an additional network connection
You can query and display multiple images in one request
Con:
If the image(s) are big and/or there will be many images, the page will be load slow
Encoding an image to base64 will make it about 30% bigger.
For more information about base encode images:
http://davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/
base64 encoded image size