Pregunta

Estoy utilizando abierto flash gráfico 2 para crear algunos gráficos. Quiero ser capaz de guardar una imagen de la gráfica, la cual suministra OFC2 algunos métodos para lograr esto. He utilizado el ejemplo en el sitio OFC2 para visualizar directamente los datos de imagen sin procesar en la página, pero que no funciona en IE6, que la mayoría de nuestros usuarios están utilizando (lo sé, lo sé).

I cambiado a usar la OFC2 método, post_image para publicar los datos de imagen en bruto al servidor. Yo uso un script en Perl para recibir los datos de la imagen, guardarla en un archivo, y puedo ver la imagen. La parte desafortunada sobre el uso del método es que post_image ActionScript emite un error al guardar la imagen: Error # 2101:. La cadena que se pasa a URLVariables.decode () debe ser una cadena de consulta codificada en URL que contiene pares de nombre / valor

que al parecer es un error en Adobe - ver esta página . Debido a este error, el método post_image no se completa correctamente, por lo que la devolución de llamada javascript no siempre fuego - que básicamente no tienen manera de saber si la imagen se ha guardado correctamente

.

Por lo tanto, pensé que iba a utilizar el método de get_img_binary OFC2 para obtener los datos binarios de la imagen, y el uso de jQuery para publicar los datos binarios a mi script de Perl.

No puedo encontrar la manera de enviar los datos binarios correctamente, o cómo dejar que mi script de Perl recibir los datos binarios correctamente, o ambas cosas.

Aquí está mi función de jQuery:

    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 );
        }
    });

Se puede ver en algunas de mis líneas de comentarios que he probado varios ContentTypes y otros ajustes de la llamada Ajax.

La llamada Ajax es el envío de algunos datos, pero no parece ser binarios. Creo que es una representación de la base 64 de datos binarios.

¿Alguien tiene alguna idea sobre cómo enviar datos binarios de javascript para el servidor?

El script Perl que tengo funciona bien para el método post_image, así que no creo que el problema está ahí?

Gracias de antemano!

¿Fue útil?

Solución

Me parece haber tropezado con la solución.

Aquí está mi llamada AJAX:

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 );
    }
});

Y aquí está mi fragmento de Perl para procesar / guardar la imagen:

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

he tenido que decodificar la representación base 64 del archivo PNG y, a continuación, guardarlo en un archivo.

Otros consejos

i tengo problemas también con el uso de IE6 y OFC2 para guardar la imagen ... Así que aquí están los scripts que uso (Javascript + PHP)

Sé que no es muy bonito, pero jQuery no quiere trabajar en una ventana emergente creada a través de window.open ( '') en mi IE6, así que decidí utilizar un "método de la vieja escuela" para conseguirlo ...

// 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
}

Por lo tanto, cuando utilizamos el save_image () función (que se llama de forma automática al hacer dans Clic selecciona "Guardar imagen localmente" en el gráfico Flahs) la imagen de la carta se tranfered a la ventana emergente y los datos (base 64) de imagen binaria destinados a un script php /ofc/base64post.php que Ränder la imagen:

<?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;
?>

esperanza de que ayudar a alguien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top