• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

imagejpeg() kann externe Bilder nicht speichern

CGollhardt

Mitglied
Guten Abend, ich verzweifel gerade. Ich habe eine Datei, die mir Grafiken ausgibt bzw. resized.

Damit die Grafik nicht jedesmal "berechnet" werden muss, speichere ich diese seit neuesten auf den Server. Wurde länger als 1 Monat darauf nicht zugegriffen werden, wird diese gelöscht.

Problem:

:arrow: Interne Grafiken ($_GET['file']) können ohne Probleme gespeichert werden
:arrow: Externe Grafiken ($_GET['url']) werden nicht gespeichert

Test $_GET['url'] String:
Code:
http://ggs-clan.de/grafik.php?url=http%3A%2F%2Ftiles.xbox.com%2Ftiles%2Foo%2FP5%2F0mdsb2JgbA9ECgR8GgMfWSpVL2ljb24vMC84MDAwIAABAAAAAP3Wg70%3D.jpg

echo von $cache_url ergibt korrektes Verzeichnis.

Hier meine grafik.php:
PHP:
<?php
define("SCRIPT_TIME", microtime(true));
$errorMessage = 'Die Grafik konnte nicht erstellt werden';
require('php/global/settings.inc.php');
//Grafik definieren
if (isset ($_GET['file'])) {
	$_GET['file'] = strip_tags ($_GET['file']);
	$url = 'grafiken/' . $_GET['file'] . '.jpg';
	if (!file_exists ($url)) {
		die ($errorMessage);	
	}
} elseif (isset ($_GET['url'])) {
	$_GET['url'] = strip_tags ($_GET['url']);
	$url = rawurldecode ($_GET['url']);
} else {
	die ($errorMessage);	
}
//Größe berechnen
$info = getimagesize($url);
if ($info[2] != 1 && $info[2] != 2 && $info[2] != 3) {
	die ($errorMessage);	
}
$NoThumbnail = false;
if (isset ($_GET['width']) && isset ($_GET['height'])) {
	$width = $_GET['width'];
	$height = $_GET['height'];
} elseif (isset ($_GET['width']) || isset ($_GET['height'])) {
	if (isset($_GET['width'])) {
		$width = $_GET['width'];
		$height = ($width/$info[0])*$info[1];
	} else {
		$height = $_GET['height'];
		$width = ($height/$info[1])*$info[0];
	}
	if (($height > $info[1]) || ($width > $info[0])) {
		$NoThumbnail = true;
	}
} else {
	$height = $info[1];
	$width = $info[0];
	$NoThumbnail = true;
}
//Grafiken aus den Cache laden
$Tage = 14;
$exp_gmt = gmdate("D, d M Y H:i:s", time() + 60 * 60 * 24 * $Tage) ." GMT";
$mod_gmt = gmdate("D, d M Y H:i:s", getlastmod())." GMT";
header('Expires: ' . $exp_gmt);
header('Last-Modified: ' . $mod_gmt);
header('Cache-Control: private, max-age=' . (60 * 60 * 24 * $Tage));
header('Cache-Control: pre-check=' . (60 * 60 * 24 * $Tage), false);
header('Content-type: image/jpeg');
//Cache URL erstellen
$cache_url = 'cache/grafik/' . md5 ($url . 'w' . $width . 'h' . $height) . '.jpg';
//Bild in Speicher laden
if (file_exists ($cache_url)) {
	$image = imagecreatefromjpeg($cache_url);
	$NoThumbnail = true;
} else {
	if($info[2] == 1) {
		$image = imagecreatefromgif($url);
	} elseif($info[2] == 2) {
		$image = imagecreatefromjpeg($url);
	} elseif($info[2] == 3) {
		$image = imagecreatefrompng($url);
	}
}
if ($NoThumbnail) {
	imageinterlace($image,$script['grafik_interlace']);
	imagejpeg($image, NULL, 100);
} else {
	$imagetc = imagecreatetruecolor ($width, $height);
	imagecopyresampled ($imagetc, $image, 0, 0, 0 ,0, $width, $height, $info[0], $info[1]);
	imageinterlace ($imagetc, $script['grafik_interlace']);
	imagejpeg ($imagetc, $cache_url, 100);
	imagejpeg ($imagetc, NULL, 100);
}
?>

Woran kann das liegen? Vielen Dank für eure Hilfe

edit

Das Bild exestiert jedoch! Die url ist nur rawurlencode() codiert. Die Grafik wird korrekt durch imagejpeg ($imagetc, NULL, 100); ausgegeben. Lediglich imagejpeg ($imagetc, $cache_url, 100); funktioniert nicht

edit 2
Habe den Fehler selber gefunden. Ich habe keine höhe und breite übergeben, dadurch muss das Bild nicht resized werden, also auch kein Bild gespeichert werden.

Sorry falls Ihr euch schon damit auseinandergesetzt habt. Manchmal sieht man den Wald vor Bäumen nicht und Postet erst, bevor man auf die Lösung kommt.
 
Zuletzt bearbeitet:
Edit: Na gut, daneben geraten. ;)

Das hier sollte einen Hinweis liefern, wo der Fehler liegt:

PHP:
<?php

error_reporting(-1);

$res = imagecreatefrompng('http://www.google.de/intl/en_com/images/srpr/logo1w.png');

Eventuelle Alternativen sind curl (muss natürlich installiert sein) und offenbar fsockopen (Socket-Verbindungen müssen erlaubt sein). Eventuell gibt es weitere, ich habe nur kurz gesucht ("allow_url_fopen alternative").

- PHP: cURL - Manual
- PHP: fsockopen - Manual

Im Zend Framework gibt es mit Zend_Http_Client zum Beispiel eine Klasse, die wohl alle Möglichkeiten durchprobiert.

- Zend Framework: Documentation: Zend_Http_Client - Connection Adapters - Zend Framework Manual
 
Zuletzt bearbeitet:
umleitung.gif

Musste ich mir jetzt erstmal selber antun...

Nein vielen Dank mermshaus, dass du dir die Mühe gemacht hast. Vielen Dank dafür. Habe aber wie bereits gerade eben geschrieben den Denkfehler schon gefunden.

Das Zend Framework will ich nicht benutzen, programmiere doch nur just 4 fun, wenn es um PHP geht. Und wenn ich schon 5.000 Räder neu erfunden habe, weiß ich wenigstens, dass ich es neu erfinden kann:razz:

Die anderen Links muss ich mir mal genau anschauen, habe nämlich eh schon vor gehabt (Im Rahmen meines aktuellen Projektes), webseiten zu Parsen.

Mal schauen ob ich die Daten die ich aus folgendem xml File bekomme:
Code:
http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag=GGS%20DiamondZ

Auch von
Code:
http://live.xbox.com/de-DE/profile/Achievements/ViewAchievementSummary.aspx?compareTo=GGS DiamondZ
parsen kann. Ich denke das wird eh so ein Thema werde, wo ich wirklich gut Hilfe vom Forum (un Dauerpostern wie dir) gebrauchen könnte... Vorallem wegen dem Login. Mal schauen was sich zu gegebenen Zeitpunkt im Internet finden lässt.

Aber trotzdem nochmal danke!
 
Zurück
Oben