2011-03-22 58 views
0

更新:請參閱消息底部的BitmapData到電子郵件

你好所有,這裏的問題: 我試圖採取在Flash中的影片剪輯的「截圖」,其編碼爲Jpg使用AS Core Lib JPGEncoder類,然後將POST提交給PHP,並將圖像嵌入到MIME編碼的電子郵件中。

目前,我測試過在本地保存編碼圖像,並且工作,所以編碼器肯定是工作。電子郵件發送,它有一個100kb的jpg附件,但它應該包含錯誤的數據,因爲它在任何應用程序中都無法正常打開。

這裏的動作腳本:

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('[email protected]'=>'Battle for Brisbane')) 
    /*Set the to addresses with an associative array*/ 
    ->setTo(array('[email protected]')) 
    /*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代碼中,我標記了一條將張貼的圖像數據作爲jpg附加到電子郵件的行。如果我註釋掉這一行,並且消息 - >附加行,那麼每個都會發送正常。但是,如果他們沒有註釋,那麼就不會發送電子郵件,這導致我相信嘗試從提供的數據創建jpg附件會導致問題。 這一切都證實了我對PHP腳本收到的數據不正確的懷疑。多好,令人沮喪。

+0

既然你可以保存的圖像服務器和查看它,這個問題是不相關的Flash,除了chunk_split/base64編碼當你保存圖像與電子郵件發送時,還有什麼不同?您是否嘗試過使用服務器上保存的JPG格式的同一電子郵件例程? – ocodo 2011-03-22 23:49:24

回答

2

您應該認真考慮using a modern mail library like SwiftMailer而不是構建自己的MIME標頭和主體。正如你現在知道的那樣,手工做正確的做法可能是一種皇家的痛苦。

您還應該確保PHP正在接收的數據實際上是一個錯誤的圖像,然後再假設它是錯誤的郵件。嘗試將您的file_get_contents的結果保存到磁盤並在瀏覽器中查看它,只是爲了確保。

+0

引用OP「目前,我已經測試過在本地保存編碼圖像,並且工作正常」......同意像SwiftMailer這樣的庫更直接,更容易出錯,然後自行滾動。 +1 – ocodo 2011-03-22 23:53:18

+0

啊哈,錯過了。 – Charles 2011-03-22 23:58:52

+0

立即使用Swiftmailer。使代碼更清晰,但圖像附件問題盛行。 – 2011-03-23 02:35:39

0

我在這裏稍微偏離了我的舒適區,但我相信您可能需要添加更多標題信息。

喬納森·馬斯頓創造了一個包裝類來做到這一點,它可以在這裏找到: 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);