Anzeige:
Ergebnis 1 bis 5 von 5

Thema: AJAX und dynamische Bilder vom Server

  1. #1
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825

    AJAX und dynamische Bilder vom Server

    Hallo Leute,

    diesmal habe ich ein AJAX-Problem: der Server generiert mir ein Bild, dieses soll nun ein vorhandenes ersetzen.
    Nicht weiter wild, wozu gibt es RFC2397?

    Leider hustet mir der Firefox was, wenn er die Daten darstellen soll.

    php-Code:
    Code:
    $ima2=... (das Ergebnis etlicher Bildmanipulationen, sieht ok aus)
    // Ausgabe
    header("Content-Type: text/plain");
    header("Content-Transfer-Encoding: base64");
    $image64   = base64_encode(imagegif($ima2));
    print $image64;
    Javascript-Code, req ist mein Request:
    Code:
     req.onreadystatechange=function()
      { if (req.readyState==4)
        { if (req.status==200) auswerten(req.responseText);
          else alert('Fehler:'+req.status);
        }
      }
    
    
    function auswerten(my_text)
    { document.getElementById('out').firstChild.nodeValue="...feddich!"; 
      var ima_out=document.getElementById('ziel');
      ima_out.src='data:image/gif;base64,'+my_text;
    }
    Status:
    $ima2 ist das Bild, was angezeigt werden soll, sieht auch so aus, wie es sein soll.
    In my_text (Response) steckt das drin, was auch in einer abgespeicherten GIF-Datei drin ist. Also mit folgendem Start:
    GIF89aÀ�À�ç��ÿ�...

    Im image.src steckt dann auch drin:
    data:image/gif;base64,GIF89a%EF%BF%BD%00%EF%BF%BD...

    Aber das Bild selbst wird nicht angezeigt.

    1.Warum?
    2.Abhilfe?

    so long,
    BlueJay
    Eigentlich ganz einfach, wenn man's weiss!

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Ich darf dir die Manual Seite von imagegif zitieren:

    "ImageGIF() erzeugt eine Datei im Format GIF aus im . Falls Sie filename angegeben haben, wird die Ausgabe in diese Datei geschrieben, ansonsten wird die Ausgabe direkt an den Browser geleitet. Im ist das Ergebnis der imagecreate()-Funktion."


    als Lösung würde ich dir vorschlage auf dein og RFC zu verzichten und
    einfach per JS das src Attribut des Bildes ändern, evtl (um caching probleme zu vermeiden) noch als get PArameter den aktuellen Timestamp dranhängen.

    Das src Attribut des Bildes setzt du einfach auf dein PHP skript, welches das bild mit imagegif ausgibt (davor nat. header setzt)


    NACHTRAG:
    dir hätte eingetlich schon an der Ausgabe des php skritpes auffallen können, dass es sich hier nicht um einen base64 enkodierten wert handelt . Wenn du doch deine Lösung mit data URI benutzen willst,
    schau dir die Output-Control Funktionen von php an: http://de.php.net/manual/de/ref.outcontrol.php und bau die um imagegif rum, so dass du die ausgabe dann noch base64 enkodieren kannst.
    Geändert von msi (01-03-2010 um 17:45 Uhr)

  3. #3
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Tja, als Datei zwischenzuspeichern würde zwar gehen, aber dann hätte ich das Directory bald voll mit Dateileichen.

    Natürlich habe ich auch versucht, das ima vor dem Umwandeln in ein GIF abzuschicken, aber das hat dem base64_encode nicht geschmeckt.

    In meinen Augen ist das GIF ja heile angekommen, es sah genauso aus wie in einem Hex-Editor. Ist aber wohl doch nicht das richtige Format.

    Das Bild als img src="dingsbums.php?parameterkrempel" funktioniert zwar, aber:
    Die Erzeugung des Bildes frisst mir 10s Rechenzeit auf dem Server.
    Dieses Bildchen soll auf 7 absolut positionierte und bewegliche divs verteilt werden, also irgendwie gecached werden.
    Gebe ich die uri in den anderen Divs an, belästigt die Seite 7x den Server (damit übersteigt's meine erlaubte Rechenzeit), speichere ich es auf dem Server zwischen, habe ich nach einem Monat jede Menge Dateileichen, also so oder so ist der Ärger mit den Provider vorbestimmt.

    Es wäre mir schon am liebsten, dass das fertige Bild als Binärdatenstrom auf dem Client liegt zum fröhlichen Clonen.
    Eigentlich ganz einfach, wenn man's weiss!

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    ich glaub du hast nicht ganz verstanden auf was ich raus wollte..

    dein problem ist, dass imagegif das Bild nicht als Rückgabewert liefert, sondern
    direkt ausgibt (da ist sozusagen alles per echo in der funktion). Der Rückgabewert von imagegif ist was ganz anderes. Deshalb kommt deine base64_encode funktion nie zum zug.
    Was du deshalb im Client siehst was ankommt ist das gif, aber eben nicht base64 enkodiert, deswegen kommen da auch binärzeichen vor. Wäre es base64 würdest du nur a-Z0-0 und ein paar andere DARSTELLBARE zeichen sehen.

    Zwei Lösungsansätze
    a) als img src= direkt das Bild angeben. Auch wenn du das in 7 versch Bildern machst, wird der Browser es nur einmal laden, so schlau sind die inzwischen
    b) um das imagegif einen output buffer bauen. du brauchst das Bild gar nicht auf dem server zu speichern. schau dir die output buffering funktionen doch an.

    PHP-Code:
    ob_start()
    imagegif(..);
    $bild ob_get_contents();
    ob_end_clean();
    echo 
    base64_encode($bild

  5. #5
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Oops, da war ich wohl ganz schön vernagelt!

    Ergebnisse:

    1. mit dem Stream hat es beim Firefox geklappt. (Response in 8-10s)
    2. die URI-Version scheint zumindest im Firefox nur 1 Request auszulösen. (Response in 10s)
    3. IE7 arbeitet im Prinzip ajax/streamweise und uriweise.
    4. bei großen Datenmengen (viele feine Linien) bricht die Übertragung im IE7 via AJAX/Stream ab. Es gibt also nur ca.3/4 des Ursprungsbildes zu sehen.
    Geändert von BlueJay (03-03-2010 um 04:32 Uhr) Grund: weitere Versuche
    Eigentlich ganz einfach, wenn man's weiss!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •