BitmapData от Flash до PHP до электронной почты

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

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

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

Вот ActionScript:

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-коде я пометил строку, которая прикрепляет данные изображения POSTed как jpg к электронной почте. Если я прокомментирую эту строку и строку message-> attach, то каждый отправит штраф. Однако, если они раскоментированы, ни одно письмо не отправляется, что заставляет меня думать, что попытка создания jpg-вложения из предоставленных данных вызывает проблему. Все это только подтверждает мои подозрения, что данные, полученные с помощью PHP-скрипта, неверны. Как приятно и неприятно.

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

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

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

Джонатан Марстон создал для этого класс-оболочку, который можно найти здесь: 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);