Pregunta

versión rápida:

¿Cómo consigo una imagen que se ha generado en el navegador de los usuarios de vuelta al servidor?

El plan actual es la siguiente:

  1. El desarrollador de Flash va a 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 utilizar un StreamReader para leer el mensaje y lo guarda como un archivo.

¿Funcionaría? Cualquier código / muestras existentes para hacer esto?

supongo que deberíamos ser capaces de mirar código para hacer cualquier carga de archivos de ASP.NET.

¿Fue útil?

Solución

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

Te voy a caminar a través del elemento de Flash y luego el backend .NET.

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. Vamos a necesitar un codificador JPEG (que Flash no tiene, pero las versiones recientes de Flex hacerlo), que podemos obtener de la AS3 Core Lib http://code.google.com/p/as3corelib/ . También necesitaremos un codificador de base 64 para enviar los datos a través del cable. Voy a usar el de Dinámicas Flash, disponible en http://dynamicflash.com/goodies/base64/ .

Descargar estos y extraerlos en alguna parte sensata de su disco duro (como una carpeta C: \ lib).

He creado un archivo de Flash AS3 y se guarda como uploader.fla . He añadido un componente Button al escenario y lo llamó btnUpload . A continuación he editado la configuración de ActionScript y añadí mi c: \ lib carpeta a la ruta de clase. Entonces me dio el documento un nombre de clase de Uploader y se guarda el archivo.

A continuación, he creado un archivo de ActionScript y añadido el código siguiente a ello:

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

Me salvó este archivo al lado de la FLA con el nombre Uploader.as .

publiqué el SWF en la raíz de mi página web Asp.NET. Este código se supone que desea cargar el archivo JPEG con una calidad de 100% y que la secuencia de comandos que recibirá los datos se denomina upload.aspx y se encuentra en la raíz del sitio.

ASP.NET

En la raíz de mi página web he creado un formulario Web llamado upload.aspx. En el archivo .aspx, quité todo el contenido aparte de la directiva de página. Es ver el contenido de esta manera:

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

A continuación, en el CodeBehind, I añade lo 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");
    }
}

Obviamente, hay valores no modificables, como la ruta para guardar pero a partir de esto, usted debe ser capaz de crear cualquier sistema que requiera.

Otros consejos

Si necesita manipular la imagen, siempre y cuando usted puede conseguir un byte [] o una corriente de los archivos subidos, puede crear una imagen de ella, por ejemplo.

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

Haga que enviar 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top