2009-05-29 8 views
7

Versión rápida:¿Cómo paso una imagen de Flash a ASP.NET?

¿Cómo obtengo una imagen que se generó en el navegador de los usuarios de vuelta al servidor?

El plan actual es la siguiente:

  1. El desarrollador de Flash convertirá el mapa de bits a JPEG
  2. Él luego enviar el archivo JPEG a una página en el sitio.
  3. Estoy pensando que puedo crear un WebService que usará un StreamReader para leer la publicación y guardarla como un archivo.

¿Eso funcionaría? ¿Algun código/muestras existentes para hacer esto?

Supongo que deberíamos poder ver el código para hacer cualquier carga de archivo a ASP.NET.

+0

¿Esto es AS2 o AS3? –

+0

Esto sería AS3. – EfficionDave

Respuesta

13

En este ejemplo, he creado un archivo Flash con un botón en el escenario. Cuando hace clic en ese botón, Flash envía la imagen del botón a un archivo ASPX que lo guarda como JPEG. Como verá, esto se hace dibujando el DisplayObject en un objeto BitmapData y, como tal, puede reemplazar fácilmente la referencia al botón con cualquier cosa que herede del DisplayObject (incluido un clip de película que contiene el lienzo para una aplicación de pintura, etc.) .

Te guiaré por el elemento Flash primero y luego por el .NET back-end.

flash

Para enviar una imagen generada como esta de Flash para ASP.NET (o cualquier otro backend) que vas a necesitar un par de bibliotecas 3 ª parte. Necesitaremos un Encoder JPEG (que Flash no tiene, pero las versiones recientes de Flex lo hacen) que podemos obtener del AS3 Core Lib http://code.google.com/p/as3corelib/. También necesitaremos un codificador base64 para enviar los datos a través del cable. Usaré el de Dynamic Flash, disponible en http://dynamicflash.com/goodies/base64/.

Descárguelos y extráigalos en algún lugar sensato de su disco duro (como una carpeta C: \ lib).

Creé un nuevo archivo AS3 Flash y lo guardé como uploader.fla. Agregué un componente de botón al escenario y lo llamé btnUpload. A continuación, edité la configuración de ActionScript y agregué mi carpeta c: \ lib al classpath. Luego di al documento un nombre de clase de Uploader y guardé el archivo.

A continuación, crea un archivo de ActionScript y ha añadido el siguiente código al mismo:

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); 
     } 
    } 
} 

I guardado este archivo al lado de la FLA con el nombre Uploader.as.

Publiqué el archivo SWF en la raíz de mi sitio web Asp.NET. Este código asume que desea cargar el archivo jpeg con una calidad del 100% y que el script que recibirá los datos se llama upload.aspx y se encuentra en la raíz del sitio.

ASP.NET

En la raíz de mi sitio web que creó un formulario Web llamado upload.aspx. En el archivo .aspx, eliminé todo el contenido, aparte de la directiva de la página. Es ver el contenido de esta manera:

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

Luego, en el CodeBehind, que añade el texto siguiente:

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

es evidente que hay valores no modificables, como la ruta para guardar pero a partir de esto, usted debe ser capaz de crea el sistema que necesites

+0

,,, el enlace que proporcionó para descargar el codificador de Base64 de dynamicflash.com parece no funcionar, supongo, ¿podría sugerir algunas opciones alternativas? Gracias – freebird

+0

Parece que hay uno integrado en AS3 actualmente ... –

+0

,, lo descargué de www.sociodox.com ,, me ayudó ... gracias. – freebird

0

Haga que publique los archivos como un formulario HTML estándar. Puede acceder a esos archivos en el evento Page_Load de la página que está publicando a mediante el uso de la siguiente colección

Request.Files

Esto devolverá una colección de HttpPostedFiles al igual que lo hace un control FileUpload.

1

Si necesita manipular la imagen, siempre que pueda obtener un byte [] o un flujo del archivo POSTed, puede crear una imagen del mismo, p. Ej.

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

una vez que almaceno la imagen en myImage, ¿puedo almacenarla en SQL o mostrarla al usuario en un control de imagen, si es posible? – freebird

Cuestiones relacionadas