Сохранить изображение диаграммы с открытой флэш-картой2 - PullRequest
0 голосов
/ 03 декабря 2009

Я использую Откройте Flash Chart 2 , чтобы создать несколько графиков. Я хочу иметь возможность сохранить изображение графика, который OFC2 предоставляет некоторые методы для достижения этой цели. Я использовал пример на сайте OFC2 для непосредственного отображения необработанных данных изображения на странице, но это не работает в IE6, который использует большинство наших пользователей (я знаю, я знаю).

Я переключился на использование метода OFC2, post_image для отправки необработанных данных изображения на сервер. Я использую скрипт Perl для получения данных изображения, сохранения их в файл и просмотра изображения. К сожалению, при использовании метода post_image ActionScript выдает ошибку при сохранении изображения: Ошибка # 2101: строка, переданная в URLVariables.decode (), должна быть строкой запроса в кодировке URL, содержащей пары имя / значение.

Что, по-видимому, является ошибкой в ​​Adobe - см. на этой странице . Из-за этой ошибки метод post_image не завершается успешно, поэтому обратный вызов javascript никогда не сработает - у меня практически нет способа определить, было ли изображение успешно сохранено.

Итак, я решил использовать метод OFC2 get_img_binary для получения двоичных данных изображения и использовать jQuery для публикации двоичных данных в моем сценарии Perl.

Я не могу понять, как правильно отправлять двоичные данные или как позволить моему сценарию Perl правильно получать двоичные данные, или и то, и другое.

Вот моя функция 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 );
        }
    });

Из некоторых моих закомментированных строк видно, что я пробовал различные типы содержимого и другие параметры вызова Ajax.

Ajax-вызов отправляет некоторые данные, но они не являются двоичными. Я думаю, что это представление base64 двоичных данных.

У кого-нибудь есть идеи, как отправить двоичные данные из javascript на сервер?

Сценарий Perl, который у меня есть, отлично работает для метода post_image, поэтому я не думаю, что проблема в этом?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2010

У меня тоже проблемы с использованием IE6 и OFC2 для сохранения изображения ... Итак, вот сценарии, которые я использую (javascript + PHP)

я знаю, что это не очень красиво, но jQuery не хочет работать во всплывающем окне, созданном с помощью window.open ('') на моем IE6, поэтому я решил использовать "метод старой школы", чтобы получить его ...

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

поэтому, когда мы используем функцию save_image () (которая вызывается автоматически, когда вы щелкаете правой кнопкой мыши, выбираете «Сохранить изображение локально» на диаграмме диаграмм) изображение диаграммы передается во всплывающее окно, а данные (двоичное изображение base64) публикуются в php-скрипте / ofc / base64post.php , который определяет картину:

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

надеюсь, что поможет кому-то!

0 голосов
/ 03 декабря 2009

Кажется, я наткнулся на решение.

Вот мой вызов 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 );
    }
});

А вот мой фрагмент Perl для обработки / сохранения изображения:

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

Мне пришлось декодировать представление base64 PNG-файла, а затем сохранить его в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...