2009-05-29 5 views
7

Version rapide:Comment passer une image de Flash à ASP.NET?

Comment renvoyer une image générée sur le navigateur de l'utilisateur vers le serveur?

Le plan actuel est le suivant:

  1. Le développeur Flash convertit le bitmap au format JPEG
  2. Il sera alors le POST JPEG à une page sur le site.
  3. Je pense que je peux créer un WebService qui utilisera un StreamReader pour lire la publication et l'enregistrer sous forme de fichier.

Cela fonctionnerait-il? Tout code/échantillons existant pour cela? Je suppose que nous devrions être en mesure de regarder le code pour faire n'importe quel téléchargement de fichiers sur ASP.NET.

+0

Est-ce AS2 ou AS3? –

+0

Ce serait AS3. – EfficionDave

Répondre

13

Dans cet exemple, j'ai créé un fichier Flash avec un bouton sur la scène. Lorsque vous cliquez sur ce bouton, le Flash envoie l'image du bouton à un fichier ASPX qui l'enregistre au format JPEG. Comme vous le verrez, cela se fait en dessinant le DisplayObject dans un objet BitmapData et en tant que tel, vous pouvez facilement remplacer la référence au bouton par tout ce qui hérite de DisplayObject (y compris un clip qui contient le canevas pour une application de peinture, etc.) . Je vais d'abord vous guider à travers l'élément Flash, puis le backend .NET.

flash

Pour envoyer une image générée comme celui-ci à partir de Flash à ASP.NET (ou tout autre système de traitement), vous allez avoir besoin de deux bibliothèques 3ème partie. Nous aurons besoin d'un encodeur JPEG (que Flash n'a pas, mais les versions récentes de Flex font) que nous pouvons obtenir de l'AS3 Core Lib http://code.google.com/p/as3corelib/. Nous aurons également besoin d'un encodeur base64 pour envoyer les données sur le réseau. Je vais utiliser celui de Dynamic Flash, disponible au http://dynamicflash.com/goodies/base64/.

Téléchargez-les et extrayez-les quelque part sensible sur votre disque dur (comme un dossier C: \ lib).

J'ai créé un nouveau fichier Flash AS3 et l'ai enregistré en tant que uploader.fla. J'ai ajouté un composant de bouton à la scène et l'ai nommé btnUpload. Ensuite, j'ai modifié les paramètres ActionScript et ajouté mon dossier c: \ lib au classpath. Ensuite, j'ai donné au document un nom de classe de Uploader et enregistré le fichier.

Ensuite, je crée un fichier ActionScript et a ajouté le code suivant à ce:

package 
{ 
    import flash.display.BitmapData; 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 
    import flash.utils.ByteArray; 
    import fl.controls.Button; 
    import com.adobe.images.JPGEncoder; 
    import com.dynamicflash.util.Base64; 


    public class Uploader extends MovieClip 
    { 
     // Reference to the button on the stage 
     public var btnUpload:Button; 

     // Encoder quality 
     private var _jpegQuality:int = 100; 

     // Path to the upload script 
     private var _uploadPath:String = "/upload.aspx"; 

     public function Uploader() 
     { 
      btnUpload.addEventListener(MouseEvent.CLICK, buttonClick); 
     } 

     private function buttonClick(e:MouseEvent):void 
     { 
      // Create a new BitmapData object the size of the upload button. 
      // We're going to send the image of the button to the server. 
      var image:BitmapData = new BitmapData(btnUpload.width, btnUpload.height); 

      // Draw the button into the BitmapData 
      image.draw(btnUpload); 

      // Encode the BitmapData into a ByteArray 
      var enc:JPGEncoder = new JPGEncoder(_jpegQuality); 
      var bytes:ByteArray = enc.encode(image); 

      // and convert the ByteArray to a Base64 encoded string 
      var base64Bytes:String = Base64.encodeByteArray(bytes); 

      // Add the string to a URLVariables object 
      var vars:URLVariables = new URLVariables(); 
      vars.imageData = base64Bytes; 

      // and send it over the wire via HTTP POST 
      var url:URLRequest = new URLRequest(_uploadPath); 
      url.data = vars; 
      url.method = URLRequestMethod.POST; 

      var loader:URLLoader = new URLLoader(); 
      loader.load(url); 
     } 
    } 
} 

J'enregistré ce fichier à côté de la FLA avec le nom Uploader.as. J'ai publié le fichier SWF à la racine de mon site Web Asp.NET. Ce code suppose que vous voulez télécharger le fichier jpeg avec une qualité de 100% et que le script qui recevra les données est appelé upload.aspx et se trouve à la racine du site.

ASP.NET

Dans la racine de mon site, je créé un formulaire Web nommé Upload.aspx. Dans le fichier .aspx, j'ai supprimé tout le contenu en dehors de la directive page. Il est regarder le contenu comme ceci:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="upload.aspx.cs" Inherits="upload" %> 

Ensuite, dans le CodeBehind, j'ajouté ce qui suit:

using System; 
using System.IO; 

public partial class upload : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // Get the data from the POST array 
     string data = Request.Form["imageData"]; 

     // Decode the bytes from the Base64 string 
     byte[] bytes = Convert.FromBase64String(data); 

     // Write the jpeg to disk 
     string path = Server.MapPath("~/save.jpg"); 
     File.WriteAllBytes(path, bytes); 

     // Clear the response and send a Flash variable back to the URL Loader 
     Response.Clear(); 
     Response.ContentType = "text/plain"; 
     Response.Write("ok=ok"); 
    } 
} 

Il y a évidemment des valeurs codées en dur comme le chemin de sauvegarde, mais de cela, vous devriez pouvoir créez le système dont vous avez besoin.

+0

,,, le lien que vous avez fourni pour le téléchargement de l'encodeur Base64 de dynamicflash.com semble ne pas fonctionner je suppose, pourriez-vous suggérer des options alternatives.Merci – freebird

+0

@freebird Avez-vous utilisé Google pour "ActionScript Base64 encoder"? On dirait qu'il y en a un intégré dans AS3 ces jours-ci ... –

+0

,,, je l'ai téléchargé sur www.sociodox.com ,,, il a aidé..thanks. – freebird

0

Demandez-lui de poster les fichiers comme un formulaire HTML standard. Vous pouvez accéder à ces fichiers en cas Page_Load de la page il envoyez des messages en utilisant la collection suivante

Request.Files

Cela renverra une collection de HttpPostedFiles comme ce qu'est un contrôle FileUpload fait.

1

Si vous devez manipuler l'image, tant que vous pouvez obtenir un octet [] ou un flux du fichier POSTed, vous pouvez en créer une image, par ex.

MemoryStream mstr = new MemoryStream(myByteArray); 
Image myImage = Image.FromStream(mstr); 
+0

une fois que je stocke l'image dans myImage, puis-je le stocker en SQL ou le montrer à l'utilisateur dans un contrôle d'image, est-ce possible. – freebird

Questions connexes