2012-08-08 30 views
0

我目前正在Flash中創建一個用戶界面,以便在客戶可以爲其定製產品創建自己的設計的網站上。我們的想法是,我們希望他們能夠創建自己的設計並使用底部的表單,將設計保存爲JPEG並通過PHP將其附加到電子郵件中,從而將設計發送給我們。將整個Flash文檔保存爲JPEG,以附件形式發送電子郵件

有沒有任何可能的方法來做到這一點?

回答

1

我認爲這是可能的。 首先,您將設計中的displayObject轉換爲您發送給php的byteArray。您可以使用imagecreatefromstring()函數創建圖像,請參閱:http://lv.php.net/imagecreatefromstring

例AS3

public function displayObjectToPNG(displayObject:*, scale:Number = 1):ByteArray { 
     var bmpData:BitmapData=new BitmapData(displayObject.width, displayObject.height, true, 0xFFFFFF); 
     bmpData.draw(displayObject); 

     var byteArray:ByteArray = PNGEncoder.encode(bmpData); 
     return byteArray; 
    } 
public function encodeFile(byteArray:ByteArray):Base64Encoder { 
     var base64:Base64Encoder = new Base64Encoder(); 
     base64.encodeBytes(byteArray); 
     return base64; 
    } 
public function saveFile(encodedFile:Base64Encoder, scriptLocation:String):void { 
     var data:URLVariables = new URLVariables(); 
     data.fileData = encodedFile; 


     var request:URLRequest = new URLRequest(scriptLocation); 
     request.method = URLRequestMethod.POST; 
     request.data = data; 

     var loader:URLLoader= new URLLoader(); 
     loader.addEventListener(Event.COMPLETE, function(e:Event):void {fileSaved(loader);}); 
     loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus); 
     loader.addEventListener(IOErrorEvent.IO_ERROR, ioError); 
     _fileSavesInProgress.push(loader); 

     try { 
      loader.load(request); 
     } catch (e:*) { 
      trace("an error occured of type", e); 
     } 
    } 

實現這樣的(這是當用戶點擊該按鈕,你將執行代碼):

saveFile(encodeFile(displayObjectToPNG(sprite)), "http://www.your.domain/php/sendMail.php"); 

你的PHP文件將是這個樣子。

<?php 
$png = imagecreatefromstring(base64_decode($fileData)); 

function mail_attachment($to, $subject, $message, $from, $file) { 
    $content = chunk_split($file); 
    $uid = md5(uniqid(time())); 
    $from = str_replace(array("\r", "\n"), '', $from); // to prevent email injection 
    $header = "From: ".$from."\r\n" 
     ."MIME-Version: 1.0\r\n" 
     ."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n" 
     ."This is a multi-part message in MIME format.\r\n" 
     ."--".$uid."\r\n" 
     ."Content-type:text/plain; charset=iso-8859-1\r\n" 
     ."Content-Transfer-Encoding: 7bit\r\n\r\n" 
     .$message."\r\n\r\n" 
     ."--".$uid."\r\n" 
     ."Content-Type: application/octet-stream; name=\"".$filename."\"\r\n" 
     ."Content-Transfer-Encoding: base64\r\n" 
     ."Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n" 
     .$content."\r\n\r\n" 
     ."--".$uid."--"; 
    return mail($to, $subject, "", $header); 
} 

mail_attachment("client", "subject", "your design", "[email protected]", $png); 

請注意,我沒有測試過這個,但我認爲這將是非常接近,如果不是解決方案。 祝你好運!

[編輯]如果要實施該解決方案在一個函數中使用下面的AS3代碼:

public function sendSprite(sprite:Sprite, scriptLocation:String):void { 
    var bmpData:BitmapData=new BitmapData(sprite.width, sprite.height, true, 0xFFFFFF); 
    bmpData.draw(sprite); 

    var encodedFile:Base64Encoder = new Base64Encoder(); 
    encodedFile.encodeBytes(PNGEncoder.encode(bmpData)); 

    var data:URLVariables = new URLVariables(); 
    data.fileData = encodedFile; 

    var request:URLRequest = new URLRequest(scriptLocation); 
    request.method = URLRequestMethod.POST; 
    request.data = data; 

    var loader:URLLoader= new URLLoader(); 
    loader.addEventListener(Event.COMPLETE, spriteSend); 
    loader.addEventListener(Event.OPEN, traceEvent); 
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, traceEvent); 
    loader.addEventListener(IOErrorEvent.IO_ERROR, traceEvent); 
    loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, traceEvent); 
    loader.addEventListener(ProgressEvent.PROGRESS, traceEvent); 

    try { 
     loader.load(request); 
    } catch (e:*) { 
     trace("an error occured of type", e); 
    } 

    function traceEvent(e:*):void { 
     trace(e); 
    } 

    function spriteSend(e:Event):void { 
     trace(e, "\n sprite succesfully send \n"); 
    } 

}

+0

完美!非常感謝你。 – 2012-08-13 09:44:58

+0

Pleasure :)我正在做一個類似的項目,但我似乎有一個不同的瓶頸:D。祝你的項目好運! – SKuijers 2012-08-13 10:10:26

+0

我剛剛遇到一些問題,當我嘗試運行該程序時出現錯誤,因爲Flash(CS5.5)不允許我具有多個公用函數;我聽說這是一個相當近期的變化,我想知道你是否知道解決這個問題的方法?該項目非常接近完成,這或多或少是最後一步:) – 2012-08-22 11:25:12

1

如果您使用Adobe AIR,可以直接通過電子郵件發送到您的電子郵件域而無需PHP。

當我不知道PHP時,只使用flash(as3.0)和發送的電子郵件很難實現。但是,在不知道服務器端的情況下,比如使用Adobe Air的php,我可以很容易地實現。

我很樂意推薦使用Adobe AIR發送郵件與airxmail框架。

這是一個網站:airxmail

這是一個文件建立:airxmail documetation

1

你可以畫上一個BitmapData階段,發送位圖到PHP郵件的目的。

查看本網站的一個例子如何去做saving as3 displayobject as png

訣竅是使用bitmapdata中的繪圖函數在bitmapdata上繪製舞臺。然後發送這個bitmapdata到PHP郵件用途的附件。

+0

我認爲這僅僅是我後,我非常感謝你。當點擊提交按鈕時,我會如何着手繪製舞臺?這是迄今爲止按鈕的腳本; http://pastebin.com/CSBRh4jt – 2012-08-08 13:31:10

+0

最簡單的方法是首先發送你的位圖數據/圖像,如果這個請求完成發送其餘的數據到mail.php,它將採取以前保存的圖像,併發送它。我會首先使用這個解決方案http://stackoverflow.com/questions/597947/,然後如果該請求完成發送其餘的數據到PHP。在PHP中,您可以將上傳的圖像添加爲附件 – automaticoo 2012-08-08 13:48:12

相關問題