Frage

Ich bin mit öffnen Flash Chart 2 einige Grafiken zu erstellen. Ich möchte in der Lage, ein Bild des Graphen zu speichern, die OFC2 einige Methoden liefert dies zu erreichen. Ich benutzte das Beispiel auf der OFC2 Website direkt die rohen Bilddaten auf der Seite angezeigt werden, aber das funktioniert nicht in IE6, die meisten unserer Benutzer verwenden (ich weiß, ich weiß).

Ich schaltete das OFC2 Methode, post_image zur Verwendung der rohen Bilddaten an den Server zu senden. Ich benutze ein Perl-Skript, um die Bilddaten zu empfangen, speichern Sie sie in eine Datei, und ich kann das Bild anzuzeigen. Der unglückliche Teil über die post_image Methode ist, dass eine Fehleractionscript führt, wenn das Bild zu speichern: Error # 2101:. Der String wurde an URLVariables.decode () muss eine URL-kodiert sein Abfrage-String Name / Wert-Paaren

Welche offenbar um einen Fehler in Adobe ist - siehe diese Seite . Aufgrund dieses Fehlers, führt die post_image Methode nicht erfolgreich, so ist der Javascript-Rückruf wird nicht immer Feuer - ich im Grunde hat keine Möglichkeit zu sagen, ob das Bild wurde erfolgreich gespeichert

.

So, dachte ich, dass ich die get_img_binary Methode des OFC2 verwenden würde die binären Daten des Bildes zu erhalten, und verwenden Sie jQuery die Binärdaten zu meinem Perl-Skript zu schreiben.

Ich kann nicht herausfinden, wie die binären Daten korrekt zu schicken, oder wie mein Perl-Skript zu lassen, die binären Daten korrekt oder beides erhalten.

Hier ist meine jQuery-Funktion:

    var chartObj = $("#chart_object").get(0);
    $.ajax({
        type: "POST",
        url: 'download_image.pl',
        //contentType: 'application/octet-stream',
        contentType: 'image/png',
        //processData: false,
        //data: { imgData: chartObj.get_img_binary() },
        data: chartObj.get_img_binary(),
        dataType: "text",
        success: function(data) {
            console.log( data );
        }
    });

Sie können von einigen meiner kommentiert aus Linien sehen, dass ich verschiedene Content und andere Einstellungen des Ajax-Aufruf versucht haben.

Der Ajax-Aufruf sendet einige Daten, aber es scheint nicht binär zu sein. Ich denke, es ist eine base64 Darstellung der binären Daten.

Hat jemand irgendwelche Ideen, wie binäre Daten von Javascript an den Server senden?

Der Perl-Skript Ich habe funktioniert gut für die post_image Methode, so dass ich glaube nicht, das Problem ist da?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

scheine ich auf die Lösung gestoßen zu haben.

Hier ist mein Ajax-Aufruf:

var chartObj = $("#chart_object").get(0);
$.ajax({
    type: "POST",
    url: 'download_image.pl',
    contentType: 'application/octet-stream',
    processData: false,
    data: imgData,
    dataType: "text",
    success: function(data) {
        console.log( data );
    }
});

Und hier ist mein Perl-Schnipsel zu verarbeiten / speichern Sie das Bild:

use CGI qw(:standard);
use MIME::Base64;

...
my $img64 = param('POSTDATA');
my $img = decode_base64( $img64 );
...
#then print $img out to a file in binary mode

ich die base64 Darstellung der PNG-Datei zu entschlüsseln hatte, und es dann in eine Datei speichern.

Andere Tipps

Ich habe Probleme zu bekam bei der Verwendung von IE6 und OFC2 für Bildspeicherung ... hier also die Skripte sind i verwenden (JavaScript + PHP)

Ich weiß, es ist nicht sehr schönes, aber jQuery will nicht erstellt über in einem Pop-Up arbeiten window.open ( '') auf meinem IE6 so habe ich beschlossen, verwenden, um eine „alte Schule-Methode“ um es zu bekommen ...

// javascript in the page displaying the flash chart
OFC = {};
OFC.jquery = {
    name: "jQuery",
    image: function(src) { return '<img src="data:image/png;base64,' + $('#'+src)[0].get_img_binary() + '" \/>'},
    popup: function(src) {
     var img_tag = OFC.jquery.image(src);
     var img_win = window.open('', 'imagesave');
     img_win.document.write('<html><head><title>imagesave<\/title><\/head><body>'+ img_tag + '<\/body><\/html>'); 
     img_win.document.close();
    },
    popupie: function(src) {
     var img_data = "image/png;base64,"+$("#"+src)[0].get_img_binary();
     var img_win = window.open('', 'imagesave');
     with(img_win.document) {
      write('<html>');
      write('<head>');
      write('<title>imagesave<\/title>');
      write('<\/head>');
      write('<body onload="document.forms[0].submit()">');
      write('<form action="\/ofc\/base64post.php" method="post">');
      write('<input type="hidden" name="d" id="data" value="'+img_data+'" \/>');
      write('<\/form>');    
      write('<div><img src="\/ofc\/ajax-loader.gif" border="0" alt="" \/><\/div>');
      write('<div style="font-family: Verdana;">Please wait<br \/>After you can save the   image<\/div>');
      write('<\/body>');
      write('<\/html>');
     }
     img_win.document.close();
    }
}

function save_image() { // this function is automatically called
  if ($.browser.msie)
    OFC.jquery.popupie("my_chart"); // only for IE navigators
  else
    OFC.jquery.popup("my_chart"); // for the others
}

so, wenn wir verwenden, um die save_image () Funktion (die automatisch aufgerufen wird, wenn Sie mit der rechten klicken dans wählen "Bild speichern Lokal" auf der flahs Grafik) das Bild des Diagramms ist mit dem Pop-up und die Daten (base64 Binärbild) gebucht werden, ein PHP-Skript tranfered /ofc/base64post.php , die das Bild Rander:

<?php
// base64post.php
$data = split(';', $_POST['d']);
$type = $data[0];
$data64 = split(',', $data[1]);
$pic = base64_decode($data64[1]);
header("Content-type: $type");
echo $pic;
?>

Hoffnung, dass jemand helfen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top