2011-03-24 4 views
0

J'essaie de faire une 'capture d'écran' d'un MovieClip dans Flash, l'encoder en Jpg en utilisant la classe AS Core Lib JPGEncoder, puis POST soumettre le ByteArray résultant à PHP, et incorporer l'image dans un e-mail codé MIME.BitmapData de Flash -> PHP -> Email

Actuellement, j'ai enregistré le ByteArray encodé à partir de Flash, et cela fonctionne très bien, donc le problème est dans l'envoi de Flash à PHP. J'utilise SwiftMailer pour envoyer un email complexe avec le jpeg en pièce jointe. Actuellement, le script semble se bloquer au point où je construis la pièce jointe à partir des données envoyées.

Voici le 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"); 
    } 

Et voici le 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); 

Ceci est un emploi professionnel, de sorte que toute aide serait grandement appréciée.

Mise à jour: Ce n'est pas SwiftAttachment, c'est Swift_Attachment. Manque de soulignement, problème résolu, application fonctionnelle. Merci à tous ceux qui ont posté pour m'aider avec ceci

+0

Cela semble être [une copie exacte de votre question hier] (http://stackoverflow.com/questions/5399235/bitmapdata-from-flash-to-php-to-email). J'aimerais toujours voir la sortie brute d'un GIF 1x1, bien que là-bas, pas ici. – Charles

+0

Ceci est une version raffinée de la question d'hier. Certains des problèmes mineurs ont été résolus par vous-même (en utilisant SwiftMailer maintenant au lieu de coder manuellement). Cependant, le gros problème n'est pas fini. En termes de pixel 1x1, toutes les données que j'envoie à partir de Flash-> PHP refusent d'écrire (fwrite) ou mime attach. –

+0

Est-ce que '$ image' a un' strlen'? – Charles

Répondre

0

Il semble que le problème a toujours été qu'il me manquait un trait de soulignement dans Swift_Attachment. Tu ne détestes pas ça?

+0

Droit, ça craint. Mais avec une bonne méthodologie de "débogage", il aurait été facile d'isoler le code incriminé. Fondamentalement, diviser le tout en tâches plus petites, tester un, puis construire le prochain sur le dessus. Lorsque la tâche en cours échoue, vous savez où vous pouvez vous concentrer. – goliatone

2

Avez-vous vérifié que l'image encodée est valide?

Si vous avez un serveur local ou un serveur différent, essayez-le.

En outre, vous pouvez essayer de charger une image dans votre flash et l'envoyer au serveur pour voir si cela fonctionne, au lieu d'envoyer une image générée.

Quant à la façon d'envoyer l'image de la mémoire flash, essayez cette

var request:URLRequest = new URLRequest(mailLoc); 
request.contentType = 'application/octet-stream'; 
request.method = URLRequestMethod.POST; 
request.data = bArray; 

var loader:URLLoader = new URLLoader(); 
loader.addEventListener(Event.COMPLETE, MailCompleteHandler); 
loader.addEventListener(IOErrorEvent.IO_ERROR, _onImageError); 
try 
{ 
    loader.load(request); 
} 
catch(error:Error) 
{ 
    trace("Unable to load URL"); 
} 


private function _onImageError(e:IOErrorEvent):void { 
    trace("IOErrorEvent: ",e.type," : ",e.text) 
} 

Et pour le script php, vous pouvez essayer d'abord enregistrer le fichier.

//bindary data. 
$image_bytes = $GLOBALS["HTTP_RAW_POST_DATA"]; 
//change to whatever works for you 
$file_name = "testfile.jpg"; 
$file_path = "../uploads/$file_name"; 

$file = fopen($file_path, 'w+'); 

if (!fwrite($file, $image_bytes)) { 
    return "Error writing to file: $file"; 
} 

fclose($file); 
+0

Merci pour ce que goliatone. J'ai fait les changements que vous avez suggérés. Aucun indicateur n'est levé pour les problèmes d'E/S à la fin de Flash. Pour une raison quelconque, le script PHP n'écrit pas le fichier. Odd ... –

+0

Avez-vous essayé dans un autre PHP mis en place? Ou envoyez-vous une image que vous avez téléchargée précédemment au lieu d'une image générée? – goliatone