开发者

PHP Image content type problem

I have a specific problem, and cant get over it.

For my latest project I need a simple PHP script that display an image according to its ID sent through URL. Here's the code:

header("Content-ty开发者_如何学Gope: image/jpeg");
$img = $_GET["img"];
echo  file_get_contents("http://www.somesite.hr/images/$img");

The problem is that the image doesn't show although the browser recognizes it (i can see it in the page title), instead I get the image URL printed out.

It doesn't work neither on a server with remote access allowed nor with one without. Also, nothing is printed or echoed before the header.

I wonder if it is a content type error, or something else. Thanks in advance.


Possibly the image doesn't fit into memory. Or your PHP installation doesn't have permissions to make external HTTP calls. Anyway, I suggest you never use echo file_get_contents(), use readfile instead. Also you should never use raw strings from $_GET or $_POST for file operations. Always strip null-bytes, slashes and double dots from user-provided filenames, or better yet, allow only alphanumeric characters.


I was doing something like this recently, but found this a slow method (I was doing 15+ on a page). This is slow because first your server has to download the image, and then send it to the client. This means for every image it is downloaded twice.

I came up with an alternative - redirection. This allowed the client machines to directly access the other site while hiding the real url in the HTML source code.

$r - is processed above the script, and validated to make sure it is ok.

$webFile = 'http://www.somesite.com/'.$r['type'].'/'.$r['productid'].'.jpg';
header('Location: '.$webFile);
exit();

Granted if someone put my image url in the address bar, it would redirect and the user would see the real url, but it made my page faster and I wasn't too worried about that.


You'll want to ensure that your script is not outputting any white-space. Check before and after the opening/closing PHP tags.

If that checks out, you'll want to ensure that allow_url_fopen is set to On in php.ini


try embedding your php file that retrieves the image as <img> in your html

getImage.php

header("Content-type: image/jpeg");
$img = $_GET["img"];
echo  file_get_contents("http://www.somesite.hr/images/$img");

in your html file

<img src="getImage.php?img=IMAGEID">


Probably you get some errors and the image is not displayed. Try to turn off the errors like this first:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'Off');


Check that the variable exists in the query string, and use a regular expression to make sure that it doesn't contain anything other than alphanumeric characters or a period. Then use readfile() to stream the output to the browser.

// make sure the variable exists
if (isset($_GET['image'])) {
    $image = $_GET['image'];
    // make sure it contains only letters, numbers, the underscore, and a period
if (preg_match('/^[\w.]+$/', $image)) {
    $file = "http://www.example.com/images/$image";
    // send the correct header
    header('Content-type: image/jpeg');
    // stream the output
    readfile($file);
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜