BitmapData от Flash до PHP для электронной почты - PullRequest
0 голосов
/ 23 марта 2011

ОБНОВЛЕНО: СМОТРЕТЬ НИЖЕ СООБЩЕНИЯ

Привет всем, вот проблема: я пытаюсь сделать «скриншот» мувиклипа во Flash, закодировать его как Jpg, используякласс AS Core Lib JPGEncoder, затем POST отправьте его в PHP и вставьте изображение в электронное письмо с кодировкой MIME.

В настоящее время я тестировал сохранение закодированного изображения локально, и это работает, поэтому кодировщикопределенно работает.Письмо отправляется, и в нем содержится jpg-файл размером 100 КБ, как и должно быть, однако изображение содержит неверные данные, поскольку оно не открывается должным образом ни в одном приложении.

Вот код действия:

trace("Sending Email");
    var rootMC:MovieClip = MovieClip(root);
    var data1:BitmapData = new BitmapData(rootMC.width, rootMC.height); 
    data1.draw(rootMC);

    var en:JPGEncoder = new JPGEncoder(80);
    var bArray:ByteArray=   en.encode(data1);

var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");

    var request:URLRequest = new URLRequest();
    request.requestHeaders.push(header);
    request.url = mailLoc;//MailLoc is the URL of the PHP.
    request.method = URLRequestMethod.POST;
    request.data = bArray;
    var loader:URLLoader = new URLLoader();
    loader.dataFormat = URLLoaderDataFormat.BINARY;
    loader.addEventListener(Event.COMPLETE, MailCompleteHandler);
    try
    {
        loader.load(request);
    }
    catch(error:Error)
    {
        trace("Unable to load URL");
    }

А вот и PHP:

require_once 'lib/swift_required.php';  
$image = file_get_contents("php://input");  
$attachment = SwiftAttachment::newInstance($image, 'submission.jpg', 'image/jpg');//<--This line stuffs it  

$message = Swift_Message::newInstance()  
    /*Give the message a subject*/  
    ->setSubject('Your subject')  
    /*Set the from address with an associative array*/  
    ->setFrom(array('info@battleforbrisbane.com.au'=>'Battle for Brisbane'))  
    /*Set the to addresses with an associative array*/  
    ->setTo(array('jordaanm@gmail.com'))  
    /*Give it a body*/  
    ->setBody('Congratulations! You submission to Battle for Brisbane was received'); 
    $message->attach($attachment);//<--When the attachment above is commented out, so is this  

    $transport = Swift_SendmailTransport::newInstance();  
    $mailer = Swift_Mailer::newInstance($transport);  
    $mailer->send($message); 

Обновление: сейчас я использую SwiftMailer вместо того, чтобы выписывать MIME вручную.Тем не менее, вот новая сделка: в коде php я выделил строку, которая прикрепляет данные изображения POST в виде jpg к письму.Если я закомментирую эту строку, а сообщение -> присоединить строку, то каждый отправляет нормально.Однако, если они не комментируются, электронное письмо не отправляется, что заставляет меня поверить, что попытка создать вложение jpg из предоставленных данных вызывает проблему.Все это только подтверждает мои подозрения, что данные, полученные сценарием PHP, неверны.Как мило и расстраивает.

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Вы должны серьезно подумать об использовании современной почтовой библиотеки, такой как SwiftMailer , вместо создания собственных заголовков и тел MIME.Как вы теперь знаете, правильное выполнение этого вручную может быть непростой задачей.

Вы также должны убедиться, что данные, которые получает PHP, на самом деле являются плохим изображением, прежде чем предполагать, что почта работает неправильно.,Попробуйте сохранить результаты вашего file_get_contents на диске и просмотреть его в браузере, просто чтобы убедиться.

0 голосов
/ 24 марта 2011

Я немного за пределами моей зоны комфорта, но я полагаю, что вам может понадобиться добавить еще немного информации заголовка.

Джонатан Марстон создал для этого класс-обертку, который можно найти здесь: http://code.google.com/p/asfeedback/source/browse/trunk/com/marston/utils/URLRequestWrapper.as?spec=svn4&r=4#

Что вы можете попробовать использовать следующим образом:

var byteArray : ByteArray = new JPGEncoder( 80 ).encode( data1);
var wrapper = new URLRequestWrapper(byteArray, "submission.jpg");
wrapper.url = mailLoc;

var ldr:URLLoader = new URLLoader();
ldr.dataFormat = URLLoaderDataFormat.BINARY;
ldr.addEventListener(Event.COMPLETE, MailCompleteHandler);
ldr.load(wrapper.request);
...