سؤال

انا استخدم فتح مخطط فلاش 2 لإنشاء بعض الرسوم البيانية. أريد أن أكون قادرا على حفظ صورة الرسم البياني، والتي توفر ofc2 بعض الأساليب لإنجاز هذا. لقد استخدمت المثال على موقع OFC2 لإيارة بيانات الصورة الخام مباشرة على الصفحة، ولكنها لا تعمل في IE6، والتي يستخدم معظم مستخدمينا (أعرف، وأنا أعلم).

لقد تحولت إلى استخدام طريقة OFC2، post_image لنشر بيانات الصورة الخام إلى الخادم. يمكنني استخدام برنامج نصي بيرل لاستلام بيانات الصورة وحفظه في ملف، ويمكنني عرض الصورة. الجزء المؤسف حول استخدام post_image الطريقة هي أن Actioncript يلقي خطأ عند حفظ الصورة: خطأ # 2101: تم تمرير السلسلة إلى URLVariables.Decode () سلسلة استعلام ترميز URL تحتوي على اسم / أزواج القيمة.

مما يبدو هو الخطأ في Adobe - انظر هذه الصفحة. وبعد بسبب هذا الخطأ، post_image لا تكتمل الأسلوب بنجاح، وبالتالي لن يطلق رد جافا سكريبت النار - أنا في الأساس ليس لدي طريقة لمعرفة ما إذا كانت الصورة تم حفظها بنجاح.

لذلك، اعتقدت أنني سوف تستخدم get_img_binary طريقة OFC2 للحصول على البيانات الثنائية للصورة، واستخدم JQuery لنشر البيانات الثنائية إلى البرنامج النصي Perl الخاص بي.

لا يمكنني معرفة كيفية إرسال البيانات الثنائية بشكل صحيح، أو كيفية السماح لبرنامج Perl Script تلقي البيانات الثنائية بشكل صحيح، أو كليهما.

هنا هو وظيفة مسج الخاص بي:

    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 للبيانات الثنائية.

هل لدى أي شخص أي أفكار حول كيفية إرسال البيانات الثنائية من جافا سكريبت إلى الخادم؟

البرنامج النصي بيرل الذي يعمل بشكل جيد ل post_image الطريقة، لذلك لا أعتقد أن المشكلة موجودة؟

شكرا مقدما!

هل كانت مفيدة؟

المحلول

يبدو أنني تعثرت على الحل.

هنا هو مكالمة 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، ثم احفظه على ملف.

نصائح أخرى

لدي مشكلة أيضا مع استخدام 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
}

لذلك، عندما نستخدم احفظ الصورة() وظيفة (وهي تلقائية يتم استدعاؤها عند إجراءات تلقائية عندما تقوم بتحديد Count Cans "حفظ الصورة محليا" على مخطط Flahs) يتم ترنيران صورة المخطط إلى المنبثقة والبيانات (الصورة الثنائية 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;
?>

نأمل أن تساعد شخص ما!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top