Mudsaf Posted June 29, 2019 Share Posted June 29, 2019 (edited) So basically i have this code below on test file which works perfectly. header('Content-Type:'.'image/jpeg'); header('Content-Length: ' . filesize('E:/xampp/uploads/gallery/files/mursa_00d0ad79e535628240a4462948bf31dc.jpg')); readfile('E:/xampp/uploads/gallery/files/mursa_00d0ad79e535628240a4462948bf31dc.jpg'); But when i try to implement it on my OOP file, i assume the Content-Type gets changed automatically to html/text? Any ideas what might cause this? <?php /* Grab image file outside of webroot directory */ if (session_status() == PHP_SESSION_NONE) { session_start(); } class LoadImage { private $GFilePath; private $DPath = "local"; //Fetch single image by ID public function fetchIByID($iid) { //bit validation if (!is_numeric($iid)) { die(); } require_once("main_db_con.php"); //DB connection file => might cause issue ? $conn = new DbCon; $con = $conn->connect(); //Get image by id parameter if ($res_gibi = $con->prepare("SELECT `image_url`, `mime_type` FROM images WHERE id = ? AND status = ? LIMIT 1")) { $prog_req1 = 1; //Unpublished imagec $res_gibi->bind_param("ii",$iid,$prog_req1); if ($res_gibi->execute()) { $res_gibi->store_result(); if ($res_gibi->num_rows == 1) { $res_gibi->bind_result($iurl,$im_type); if ($res_gibi->fetch()) { if ($istatus == 1) { $this->GFilePath = "E:/xampp/uploads/gallery/files/"; //local path if (file_exists($this->GFilePath.$iurl)) { //below not returning image header('Content-Type:'.'image/jpeg'); header('Content-Length: ' . filesize('E:/xampp/uploads/gallery/files/mursa_00d0ad79e535628240a4462948bf31dc.jpg')); readfile('E:/xampp/uploads/gallery/files/mursa_00d0ad79e535628240a4462948bf31dc.jpg'); //header('Content-Type:'.$im_type); //header('Content-Length: ' . filesize($this->GFilePath.$iurl)); //readfile($this->GFilePath.$iurl); //$this->GFilePath.$iurl . " | " . $im_type; //$ftype; //"<br>" . $fpath; } else { } } else { // "<p>Unauthorized or image does not exist.</p>"; } } else { // } } else { //err_fetch } } else { // "x"; //ERR_EXEC } } else { //ERR_PREP // "y"; } //Closes SQL connection unset($conn); $con->close(); } //public function __construct() { //$this->fetchIByID(994); //} } if (isset($_GET['image']) && is_numeric($_GET['image'])){ $iload = new LoadImage; $iload->fetchIByID($_GET['image']); } ?> Not fully finished code, slightly altered but you get the idea + big ugly code atm but have to fix lated. Looks like attached file on browser. Edited June 29, 2019 by Mudsaf Link to comment Share on other sites More sharing options...
dsonesuk Posted June 29, 2019 Share Posted June 29, 2019 I should keep header code outside class, and retrieve the values from class to use in those headers. Link to comment Share on other sites More sharing options...
Mudsaf Posted June 29, 2019 Author Share Posted June 29, 2019 Still the same issue if (isset($_GET['image']) && is_numeric($_GET['image'])){ $iload = new LoadImage; $arr = $iload->fetchIByID($_GET['image']); if (!empty($arr[0]) && !empty($arr[1])) { echo $arr[0] . " | " . $arr[1]; //header('Content-Type:'.$arr[1]); //header('Content-Length: ' . filesize($arr[0])); //readfile($arr[0]); } } class blablabla { //header stuff replaced with below return array($this->GFilePath.$iurl, $im_type); } Link to comment Share on other sites More sharing options...
Mudsaf Posted June 29, 2019 Author Share Posted June 29, 2019 print_r(get_headers("http://xxxx/loadimage.php?image=994",1)); returns: [Content-Type] => text/html; Any idea what could be the cause? Link to comment Share on other sites More sharing options...
dsonesuk Posted June 29, 2019 Share Posted June 29, 2019 Any output before header such as html, php echo will cause header to fail. So you need to have headers as the test file, then replace values with return class variables without! ANY echo. Link to comment Share on other sites More sharing options...
Mudsaf Posted June 29, 2019 Author Share Posted June 29, 2019 (edited) I guess i'll remake the code one by one to see where it fails (if it fails again). (Checked source code without output, is this the reason? 🤔) class DbCon { protected $con; private $db_host = ""; //Database host private $db_user = ""; //Database username private $db_pass = ""; //Database user password private $db_name = ""; //Database name public function connect() { $this->con = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name); if ($this->con->connect_error) { //die("Connection error, please try again later."); } else { return $this->con; } } } This seems to jam it, but don't know why? Even when i require_once it without running it via function call. OR something to do with require inside class. Day 17, i still cant seem to find the cure for this error, i'll continue tomorrow. Edited June 29, 2019 by Mudsaf Link to comment Share on other sites More sharing options...
dsonesuk Posted June 29, 2019 Share Posted June 29, 2019 (edited) Test it stage by stage starting from end backwards 1)Test file manually entered text string for header. Done ->Works 2) Test file using variables for text string (WITHIN header function). 3) Class temporary return predefined text string values to be used for 2. 4) class processes as intended to return text string values identical to 3. Try to avoid any empty line breaks before header functions. Edited June 29, 2019 by dsonesuk Link to comment Share on other sites More sharing options...
justsomeguy Posted July 1, 2019 Share Posted July 1, 2019 If there's a problem with the headers you should be able to open that script in a browser to see the error messages. Trying to send a header if they've already been sent will give you a warning and tell you where the first output was. You can also use an error log and check that. Link to comment Share on other sites More sharing options...
Mudsaf Posted July 2, 2019 Author Share Posted July 2, 2019 Found the error, had 2 enter presses in DB connection file after <?php ?>. Such a silly mistake that forced html/text header. 😫 Link to comment Share on other sites More sharing options...
Funce Posted July 3, 2019 Share Posted July 3, 2019 On 7/2/2019 at 6:34 PM, Mudsaf said: Found the error, had 2 enter presses in DB connection file after <?php ?>. Such a silly mistake that forced html/text header. 😫 You can omit a closing PHP tag on a file that doesn't output to prevent this from occurring. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now