2011-01-05 11 views
1

Ich habe ein spezifisches Problem, und kann nicht darüber hinwegkommen.PHP Bild Inhalt Typ Problem

Für mein neuestes Projekt benötige ich ein einfaches PHP-Skript, das ein Bild entsprechend seiner über URL gesendeten ID anzeigt. Hier ist der Code:

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

Das Problem ist, dass das Bild nicht angezeigt, obwohl der Browser erkennt (i es im Titel der Seite sehen), sondern ich die Bild-URL erhalten ausgedruckt.

Es funktioniert weder auf einem Server mit Remote-Zugriff erlaubt noch mit einem ohne. Es wird auch nichts vor dem Header gedruckt oder ausgegeben.

Ich frage mich, ob es ein Inhaltstyp Fehler oder etwas anderes ist. Vielen Dank im Voraus.

+0

Sie möchten das Bild im Browser anzeigen oder das Bild herunterladen? – zod

+0

stellen Sie sicher, dass "echo" funktioniert. versuche, diese Seite mit curl oder wget zu holen. und stellen Sie sicher, dass vor dem Echo kein vorhergehender Whitespace existiert. –

+0

Ich löste die ersten beiden Probleme, es war wirklich ein Leerzeichen und ein Code-Fehler, aber ich habe immer noch das Problem mit dem Fernzugriff, also bin ich gezwungen, CURL zu verwenden. Kannst du mir dabei helfen, weil ich mit CURL nicht so gut bin? – Mirko

Antwort

3

Möglicherweise passt das Bild nicht in den Speicher. Oder Ihre PHP-Installation ist nicht berechtigt, externe HTTP-Aufrufe durchzuführen. Wie auch immer, ich schlage vor, dass Sie nie echo file_get_contents() verwenden, stattdessen readfile verwenden. Sie sollten auch keine Raw-Strings von $ _GET oder $ _POST für Dateioperationen verwenden. Entfernen Sie immer Nullbytes, Schrägstriche und Doppelpunkte von den vom Benutzer bereitgestellten Dateinamen, oder besser, lassen Sie nur alphanumerische Zeichen zu.

+2

+1 für die Verwendung von rohen '$ _GET' in Dateioperationen. – JakeParis

+0

Das Bild ist sehr klein und das ist nur ein Testskript. Ich stimme dir bei der Verwendung von readfile und für die anderen Tipps zu, aber ich habe bereits Readfile versucht und funktioniert auch nicht. – Mirko

1

Sie sollten sicherstellen, dass Ihr Skript keinen Leerraum ausgibt. Überprüfen Sie vor und nach dem Öffnen/Schließen von PHP-Tags.

Wenn das auscheckt, werden Sie wollen sicherstellen, dass allow_url_fopen-On in php.ini gesetzt

0

versuchen, Ihre PHP-Datei einbetten, die das Bild als <img> in Ihrem HTML ruft

getImage.php

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

in der hTML-Datei

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

Ich habe es geschafft, hierher zu kommen, aber auf seltsame Weise, wenn ich die Bild-ID sende, funktioniert es nicht, es zeigt das Bild nicht an. Stattdessen, wenn ich auf die Bildquelle klicke, bekomme ich die Nachricht "Das Dokument wurde verschoben". – Mirko

0

Wahrscheinlich erhalten Sie einige Fehler und das Bild wird nicht angezeigt. Versuchen Sie, die Fehler wie dieses ersten auszuschalten:

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

Ich war vor kurzem so etwas wie dies zu tun, aber fand dies eine langsame Methode (ich war auf einer Seite tun 15+). Dies ist langsam, weil zuerst Ihr Server das Image herunterladen und dann an den Client senden muss. Dies bedeutet für jedes Bild, dass es zweimal heruntergeladen wird.

Ich kam mit einer Alternative - Umleitung. Dies ermöglichte den Client-Rechnern, direkt auf die andere Seite zuzugreifen, während die reale URL im HTML-Quellcode verborgen blieb.

$ r - wird über dem Skript verarbeitet und überprüft, um sicherzustellen, dass es in Ordnung ist.

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

Zugegeben, wenn jemand meine Bild-URL in der Adressleiste setzen, wäre es umleiten und der Benutzer würde die reale URL sehen, aber es machte meine Seite schneller und ich war nicht allzu besorgt darüber.

0

Überprüfen Sie, ob die Variable in der Abfragezeichenfolge vorhanden ist, und verwenden Sie einen regulären Ausdruck, um sicherzustellen, dass sie nur alphanumerische Zeichen oder einen Punkt enthält. Verwenden Sie dann readfile(), um die Ausgabe an den Browser zu streamen.

// 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); 
    } 
}