RE: [PHP] cant view image from database
| From: | hadi | Date: | Thu, 12 Feb 2015 21:58:14 +0000 |
| Subject: | RE: [PHP] cant view image from database | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-324445@lists.php.net to get a copy of this message | ||
> -----Original Message-----
> From: Maciek Sokolewicz [mailto:tularis@gmail.com] On Behalf Of Maciek
> Sokolewicz
> Sent: Thursday, February 12, 2015 10:18 PM
> To: hadi; 'Stuart Dallas'; 'Bastien Koert'
> Cc: php-general@lists.php.net
> Subject: Re: [PHP] cant view image from database
>
> On 12-2-2015 20:00, hadi wrote:
> >>> Hi,
> >>
> >>>
> >>
> >>> I can't view my image from mysql database.
> >>
> >>> I used curl to download the image to mysql database, and im trying
> >>> to view
> >>
> >>> the image, im getting error from firefox debugger.
> >>
> >>>
> >>
> >>> Here is my code for downloading the image
> >>
> >>>
> >>
> >>> <?php
> >>
> >>>
> >>
> >>> $servername = "localhost";
> >>
> >>> $username = "recorduser";
> >>
> >>> $password = "password123";
> >>
> >>> $database = "record";
> >>
> >>>
> >>
> >>> // Create connection
> >>
> >>> $conn = mysqli_connect($servername, $username, $password,
> >> $database);
> >>
> >>> // Check connection
> >>
> >>> if (!$conn) {
> >>
> >>> die("Connection failed: " . mysqli_connect_error());
> >>
> >>> }
> >>
> >>>
> >>
> >>>
> >>
> >>>
> >>
> >>>
> >>
> >>>
> >>
> >>> $ch = curl_init
> >>
> >>>
> >>> ("http://www.albaldnews.com/upimages/news/thumb_albald11-
> >>
> >>> 04-2014-993734.jpg"
> >>
> >>> );
> >>
> >>> curl_setopt($ch, CURLOPT_HEADER, 0);
> >>
> >>> curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
> >>
> >>> curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
> >>
> >>> $rawdata=curl_exec ($ch);
> >>
> >>> curl_close ($ch);
> >>
> >>>
> >>
> >>> $rawdata = addslashes($rawdata);
> >>
> >>>
> >>
> >>>
> >>
> >>> $sql = "INSERT INTO picture (image)VALUES ('$rawdata')";
> >>
> >>> $result = mysqli_query($conn, $sql);
> >>
> >>>
> >>
> >>> ?>
> >>
> >>>
> >>
> >>> And the code for viewing the image as flow;
> >>
> >>>
> >>
> >>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
> >>
> >>>
> >>> "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
> >>
> >>> <html
> >>> xmlns="http://www.w3.org/1999/xhtml">
> >>
> >>> <head>
> >>
> >>> <title>dispaly image</title>
> >>
> >>> <meta http-equiv="Content-Type" content="text/html;
> >>> charset=utf-8" />
> >>
> >>> </head>
> >>
> >>>
> >>
> >>> <body>
> >>
> >>>
> >>
> >>>
> >>
> >>> <?php
> >>
> >>> #header("Content-type: image/jpeg");
> >>
> >>>
> >>
> >>> $servername = "localhost";
> >>
> >>> $username = "recorduser";
> >>
> >>> $password = "password123";
> >>
> >>> $database = "record";
> >>
> >>>
> >>
> >>> // Create connection
> >>
> >>> $conn = mysqli_connect($servername, $username, $password,
> >> $database);
> >>
> >>> // Check connection
> >>
> >>> if (!$conn) {
> >>
> >>> die("Connection failed: " . mysqli_connect_error());
> >>
> >>> }
> >>
> >>>
> >>
> >>> $sql = "SELECT * FROM picture";
> >>
> >>> $result = mysqli_query($conn, $sql);
> >>
> >>>
> >>
> >>> header("Content-type: image/jpeg");
> >>
> >>> $row = mysqli_fetch_array($result);
> >>
> >>> $img = $row["image"];
> >>
> >>>
> >>
> >>> echo '<img src="'.$img.'" />';
> >>
> >>>
> >>
> >>>
> >>
> >>> ?>
> >>
> >>>
> >>
> >>> Firefox error code:
> >>
> >>>
> >>
> >>> <img
> >>> src="http://192.168.206.129/rssfeed/showimage.php"
> >>> alt="The
> >>> image
> >>
> >>>
> >>> "http://192.168.206.129/rssfeed/showimage.php" cannot be
> >>> displayed
> >> because
>
> well of course you are...
>
> Let's establish a few baselines:
> 1 - an HTML page is basically a bunch of text data, which may contain
> *links* to other data via URIs (such as an URL like
> http://www.example.com/image.jpg or /images/image.jpg)
> 2 - an image is basically a bunch of BINARY data (so NOT text(!!)) on its own.
> 3 - combining BINARY data INSIDE an HTML file does NOT work (except under
> very specific circumstances).
>
> So... what did you do wrong?
> Well, simply put:
> 1 - you altered your image data by use of addslashes() to binary data.
> Which means you've just corrupted the image-data, making it impossible to
> show without undoing the damage. Using Stuart's suggestion you would not
> have to do this.
> 2 - You are putting BINARY data inside an HTML tag. The tag however
> requires an URL and NOT raw data.
>
> How to fix this?
> 1 - get rid of the addslashes and use a prepared statement to insert the
> image data.
> 2 - instead of echoing the data, link it to a new PHP page (for instance
> showImage.php)
> 3 - inside this showImage.php file retrieve the image data just as you have
> done above, but do NOT echo or print ANYTHING except this image data
> from the database and a header with the content-type.
Hi Tul,
I did exactly what you suggest me.
Created link.html pointing to showimage1.php. but still not working im unable to view the picture.
also replaced addslashes with mysqli_real_escape_string
Link.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet php backend</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<a href="showimage1.php">view picture</a>
</body>
</html>
showimage1.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>dispaly image</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
/>
</head>
<body>
<?php error_reporting(E_ALL); ini_set('display_errors', 1);
$servername = "localhost";
$username = "recorduser";
$password = "password123";
$database = "record";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $database);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT * FROM picture";
$result = mysqli_query($conn, $sql);
header("Content-type: image/jpeg");
$row = mysqli_fetch_array($result);
$img = $row["image"];
echo $img;
?>
</body>
</html>