• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Externes Bild per PHP herunterladen

Ackergaul

New member
Hallo,
ich versuche mittels PHP externe Bilder auf meinen Server zu laden. Leider passiert es bei manchen Bildern, dass am unteren Teil ein schwarzer Balken auftritt. Hier mal ein Beispiel:

Original: http://mymind.smarti.org/wp-content/uploads/2009/04/sowa-michael-kranker-hund-8600039.jpg
Gespeicherte Version: http://images.paraorkut.com/pics/s/sowa-michael-kranker-hund-8600039-1.jpg
(um 2px verkleinert, aber auch die unverkleinerte Version ist unten schwarz)

Mein Code:
PHP:
$data = file_get_contents($external_file);
file_put_contents($local_file, $data);

Habe schon diverse Methoden zum speichern und das Ganze auch auf meinem Localhost ausprobiert, am Ergebnis hat sich nichts geändert. Zu sagen wäre noch, dass der Balken beim gleichen Bild nicht willkürlich auftritt sondern ich jedes mal exakt das gleiche Ergebnis erhalte, unabhängig davon mit welcher Methode und wie oft ich es probiere. Hat jemand eine Idee?

Viele Grüße!
 
Sehr seltsam - ich hab's gerade mit einem Script von mir versucht, das mit fopen und fread arbeitet (file_put_contents auch benutzt), und das Bild wunderbar lokal gespeichert.

Abgesehen von der rechtlichen Lage (weiß nicht, ob du einfach so diese fremden Bilder auf deinem Server speichern darst) sehe ich eigentlich kein Problem. k.A. was da falsch läuft.

Wenn der Balken immer anders aussehen würde, würde ich ja sagen, dass es ein Übertragungsproblem ist - aber so...
 
Ich habe solche Probleme auch schon gehabt, es lag jedoch immer an Übertragungsfehlern. Kann es sein dass du beim wiederholten hochladen die alten Bilder nicht ersetzt?
 
Der komplette Code sieht so aus:

PHP:
$connection_id = ftp_connect($ftp_server);
		$login_result = ftp_login($connection_id, $ftp_user, $ftp_pass);
		
		for($i=1;$i<=10;$i++) {
		
			if ((isset($_POST['url_' . $i])) AND (!isset($_POST['delete_' . $i]))) {
			
				if ($i == 1)
					$_POST = trimForm($_POST);
			
				$part1 = explode('/', $_POST['url_' . $i]);
				$anz = count($part1);
				$part2 = explode('.', $part1[$anz-1]);
				
				#var_dump($part);
				
				$sql = 'SELECT id FROM images ORDER BY id DESC LIMIT 1';
				$res = q($sql);
				$row = fetch($res);
				
				$nextID = $row['id']+1;
				
				$filename = strtolower($_POST['name_' . $i]);
				$filename = str_replace(' ', '_', $filename);
				$filename = $filename . '-' . $nextID . '.' . $part2[1];
				
				$destination_file = 'pics/' . $filename[0] . '/' . $filename;
				$external_file = $_POST['url_' . $i];
				$local_file = $filename;
				$data = file_get_contents($external_file);
				file_put_contents($local_file, $data);
				cropImage('', '', $filename);
				$upload = ftp_put($connection_id, $destination_file, $local_file, FTP_BINARY);
				unlink($local_file);
				
				$sql = 'INSERT INTO images (file_url_old, file_name, file_type, name, tags) 
						VALUES ("' . $_POST['url_' . $i] . '", "' . $imageserver_url . $filename[0] . '/' . $filename . '", "' . $part2[1] . '", "' . $_POST['name_' . $i] . '", 
						"' . $_POST['tags_' . $i] . '")';
				$res = q($sql);				
			
			}				
		}
		
		ftp_quit($connection_id);

Die Funktion cropImage verkleinert das Bild um 2px. Das Bild das an diese Funktion übergeben wird weist schon den Balken auf.

Viele Grüße!
 
1. Lass mal das lokale bestehen und schau' dir das an - ev. verändert sich der Balken doch
2. was ist am Ende in $upload gespeichert - ev. ftp-Problem?
 
Sehr komisch. Ich kann das Bild herunterladen - hier mal die wichtigen Zeilen aus meinem Script:
Code:
if ($file = @fopen($url, "r")){
	$data = "";
	while(!feof($file)) $data .= fread($file, 1024);
	$filename = createUniqueFilename(preg_replace("/^.+[\\/\\\\]([^?#]+)([?#].+)?/", "$1", $url));
					
	if (file_put_contents($imageStore . $filename, $data)){
		array_push($news, "Datei in '<i>" . realpath($imageStore . $filename) . "</i> gespeichert.");
	}
	else{
		array_push($error, "Datei konnte nicht auf dem Server gespeichert werden.");
	}
	fclose($file);
}
else{
	array_push($error, "Die externe Datei <i>" . $url ."</i> kann nicht geöffnet werden.");
}
 
Argh, ich bin doof :icon8:
Es lag doch an meiner Funktion cropImage. Diese hatte einen Fehler und ich habe nicht bedacht, dass von ihr ja der $local_file überschrieben wird.
 
Zurück
Oben