Bild vom externen Server verifizieren
Jeena Paradies
- php
Hallo,
Mensch schon lange hier nicht mehr gemeldet, da ich über einen Monat kein Internet hatte.
Jetzt zu meinem Problem:
Ich mache ein Banner-Tausch-System. Die Banner sollen wegen des Trafics auf den Servern der Leute die sie einbinden bleiben. Jetzt muss ich aber wenigstens ein mal (besser jedes mal wenn sie angezeigt werden) überprüfen ob die Banner nicht zu groß sind (sind max 100kB OK oder zu groß?), im richtigen Format sind (GIF PNG JPEG) und die richtige Größe haben (x=468px, y=60px).
Das alles geht ja wunderbar mit getimagesize() doch dazu muss die Datei auf meinem Server liegen. Per copy() würde das ja ab PHP 4.3.0 funktionieren doch leider habe ich auf dem Server nur 4.2.2 drauf.
Wie kann ich so etwas am elegantesten bewerkstelligen?
Grüße
Jeena Paradies
Nabend,
Wie kann ich so etwas am elegantesten bewerkstelligen?
Ohne es geprüft zu haben: Dein Problem wurde auf http://php3.de/getimagesize in den User Contributed Notes ebenfalls angesprochen und "djwishbone at hotmail dot com" postete deine Lösung dazu.
Zu deinem Vorhaben: Was ist, wenn ich melde mich an mit einem entsprechend zugelassenen Banner. Dann prüfst du ob er ok ist, gibst mir grünes Licht. Ein paar Tage später bin ich aber so gemein und tausche den Banner gegen ein anderes, nicht mehr den Vorschriften entsprechenden aus...
Bis denne,
Hallo,
Ohne es geprüft zu haben: Dein Problem wurde auf http://php3.de/getimagesize in den User Contributed Notes ebenfalls angesprochen und "djwishbone at hotmail dot com" postete deine Lösung dazu.
Dankeschön, ich habe die ganze Zeit mit dem PHP Manual auf meinem Rechner gearbeitet und da steht das ja natürlich nicht drin.
Zu deinem Vorhaben: Was ist, wenn ich melde mich an mit einem entsprechend zugelassenen Banner. Dann prüfst du ob er ok ist, gibst mir grünes Licht. Ein paar Tage später bin ich aber so gemein und tausche den Banner gegen ein anderes, nicht mehr den Vorschriften entsprechenden aus...
Deswegen hatte ich die Idee jedes mal vor dem Anzeigen den Banner zu prüfen. Das Problem dabei ist wiederum dass das dann den gleichen, bzw. mehr Traffic erzeugt. Logischerweise schießt man sich in erster Linie selbst in den Fuß, aber man schadet ebenfalls dem Unternehmen das den Bannertausch anbietet.
Ist also die einzige Alternative den Banner selbst zu hosten?
Grüße
Jeena Paradies
Hallo,
Noch ein kleiner Nachtrag.
Ich dachte das ganze eher als so eine Hilfe für den unbedarften User damit er nicht gleich was föllig falsches hochläd. Ich denke dass das einzige was der Firma schaden würde eine zu große Dateigröße wäre. Ich versuche jetzt mal herauszufinden ob man die nicht resourcenschonend jedes mal prüfen könnte. Das steht doch irgendwo im header oder nicht?
Die Höhe und Breite sind sowieso per <img width="468" height="60" src="..." /> Vorgegeben, dann wird der Banner halt gestaucht oder so. Und das mit GIF PNG und JPEG da kann man im endeffekt nur das erreichen dass der Banner nicht mehr angezeigt wird.
Grüße
Jeena Paradies
Hallo,
Ich habe mich jetzt mal umgeguckt und andere Bannersysteme prüfen meistens nicht einmal beim ersten mal. Deshalb bin ich zu dem Schluss gekommen, dass ich nur beim hochladen prüfen werde und danach jedes mal nur die Größe der Datei mit dieser Funktion:
function remotefiletoobig($file,$maxbytes) {
// $maxbytes; // in bytes
// Open the file, but only read maximum size
$fp = fopen($file, "r");
$first_file_size_read = fread($fp, $maxbytes + 1);
fclose($fp);
return (strlen($first_file_size_read) > $maxbytes);
}
Ich prüfe mittels von Hubert vorgeschlagener Funktion die Breite und Höhe überlege aber noch ob ich das nicht doch irgendwie hinkriegen könnte das File auf meinen Server zu kopieren und dort auch noch den Typ zu ermitteln. Leider komme ich nicht so richtig dahinter wie ich das bewerkstelligen könnte. Es würde mir auch schon reichen zu prüfen ob das remote-file den richtigen Typ hat, das wird aber warscheinlich nicht gehen. Deshalb suche ich eine Kopierfunktion für Bilder.
Auch verstehe ich nicht so richtig ob ich mit der Funktion die Hubert vorgeschlagen hat auch den Typ irgendwie herausfinden kann.
Grüße
Jeena Paradies
Moin!
Ich habe mich jetzt mal umgeguckt und andere Bannersysteme prüfen meistens nicht einmal beim ersten mal. Deshalb bin ich zu dem Schluss gekommen, dass ich nur beim hochladen prüfen werde und danach jedes mal nur die Größe der Datei mit dieser Funktion:
Wah!!!1 Traffic kostet ja nichts, ist schon klar. Muß ja auch nur der Banneranbieter doppelten Traffic zahlen, ist ja nicht dein Bier (außer dass du natürlich trotzdem den Traffic hast, weil es egal ist, ob du den bei dir gelagerten Banner nun an den User auslieferst und dabei mit zeitlich sehr schnell ablaufenden Funktionen das Banner - wenn es denn unbedingt sein muß - auf diverse Regeln prüfen kannst (wobei man das sinnvollerweise beim Upload einmal prüft, und dann nie wieder), oder ob du den Banner von extern mehr oder weniger komplett bei jeder Seitenanforderung ausliest, dabei auf das Vorhandensein und die Ansprechbarkeit des externen Servers vertraust (wenn der down ist, kommt deine generierte Seite nämlich auch nicht oder nur mit extremer Verzögerung!), und damit denselben Traffic nur in die andere Richtung verursachst.
Also entweder vertraust du deiner Remote-Quelle, oder nicht. Wenn nicht: Ständig prüfen, ob das File deinen Anforderungen entspricht, dürfte nicht das sein, was deine Prämisse war: Traffic sparen. Da ist das absolute Gegenteil der Fall.
- Sven Rautenberg
Hallo,
Wah!!!1 Traffic kostet ja nichts, ist schon klar. [...] andere Richtung verursachst.
Phuh das war ein langer Satz. Danke für deine Gedanken. Ich glaube mein Fehler liegt darin, dass ich nicht so richtig verstanden habe dass diese Funktion im Endeffekt den ganzen Banner wieder einliest und somit den gleichen Traffic verursacht.
Also entweder vertraust du deiner Remote-Quelle, oder nicht.
Ich habe mich nun entschieden, dass ich der Remote-Quelle vertraue und nicht jedes mal prüfe sondern nur beim ersten mal wenn man sich anmeldet.
BTW Sven, irgendwann hast du mal jemanden geantwortet dass es besser sei irgendwie mysql Funktionen für das Maskieren von '"\ einzusetzen, so habe ich das zumindest verstanden. Nur kapiere ich nicht so richtig wie das gehen soll und finde das Posting gerade nicht. Man sollte da erst prüfen ob magic_quotes an sind und dann das irgendwie machen. Kannst du das eventuell noch einmal verständlich erklären? Und vor allem mit welcher mysql Funktion und wie man die einsetzt.
Grüße
Jeena Paradies
Hallo,
Jetzt habe ich noch ein anderes Problem und zwar will ich ja auch diesen Quellcode ausgeben lassen, den die Leute dann auf ihre Homepage einfügen.
Normalerweise fürde der Pfad so lauten:
http://b24.info/ini.php?id=xx
Das Problem ist dass ich das eigentlich erst einmal allgemein lösen will, so dass es egal ist auf welcher Seite das ding läuft also auch
http://jeena.net/ini.php?id=xx
Also dachte ich an so was:
$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/ini.php?id=xx"
Da aber das Script nicht im gleichen Verzeichniss ist wie quellcode.php muss ich um eine Verzeichnissebene runter. Also funktioniert theoretisch so was
$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/../ini.php?id=xx"
Das sieht aber ziemlich bescheiden aus. Könnte mir jemand einen Tipp geben wie ich das hindeichseln könnte?
Grüße
Jeena Paradies
Moin!
$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/../ini.php?id=xx"
dirname(dirname());
Ein Verzeichnis ist ja auch nur eine Datei, in der eine Liste von Dateien gespeichert ist. Und da dirname() sowieso nur eine Stringfunktion ist, die vom String alles hinter dem letzten "/" abschneidet, funktioniert das doppelte Anwenden ganz gut.
- Sven Rautenberg
Hallo,
$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/../ini.php?id=xx"
dirname(dirname());
Ein Verzeichnis ist ja auch nur eine Datei, in der eine Liste von Dateien gespeichert ist. Und da dirname() sowieso nur eine Stringfunktion ist, die vom String alles hinter dem letzten "/" abschneidet, funktioniert das doppelte Anwenden ganz gut.
hm na also darauf wäre ich nie gekommen. Theoretisch könnte ich das ja dann zweckentfremden und auch für andere Sachen die mit einem "/" getrennt sind verwenden. Ich weiß zwar noch nicht was das sein sollte, aber könnte in Zukunft nützlich sein.
Vielen Dank.
Grüße
Jeena Paradies