Domanda

Rapida versione:

Come faccio a ottenere un'immagine che è stato generato per gli utenti del browser al server?

Il piano attuale è questa:

  1. Flash developer sarà la conversione da bitmap a JPEG
  2. Poi, POST JPEG ad una pagina del sito.
  3. Sto pensando di creare un WebService che si avvarrà di un StreamReader per leggere il post e salvarlo come un file.

Vorresti che il lavoro?Codice/campioni per fare questo?

Credo che si dovrebbe essere in grado di guardare il codice per fare qualsiasi upload di file ASP.NET.

È stato utile?

Soluzione

In questo esempio, ho creato un file Flash con un pulsante sul palco. Quando si fa clic quel pulsante, Flash invia l'immagine del pulsante in un file ASPX che lo salva come file JPEG. Come si vedrà che questo è fatto disegnando il DisplayObject in un oggetto BitmapData e come tale, si può facilmente sostituire il riferimento al pulsante con qualsiasi cosa che eredita da DisplayObject (tra cui un clip filmato che contiene la tela per un'etc applicazione della vernice) .

Ti accompagno attraverso l'elemento Flash e poi il back-end .NET.

Flash

Per inviare un'immagine generata come questo da Flash per ASP.NET (o qualsiasi altro backend) si sta andando ad avere bisogno di un paio di librerie 3rd party. Avremo bisogno di un codificatore JPEG (che Flash non ha, ma le versioni recenti di Flex fare), che possiamo ottenere dal AS3 Nucleo Lib http://code.google.com/p/as3corelib/ . Ci sarà anche bisogno di un encoder base64 per inviare i dati oltre il filo. Userò quello da Dynamic Flash, disponibile all'indirizzo http://dynamicflash.com/goodies/base64/ .

Scarica questi e estrarli da qualche parte sensibile sul disco rigido (come una cartella C: \ lib).

Ho creato un nuovo file Flash AS3 e salvato come uploader.fla . Ho aggiunto un componente pulsante per il palco e lo ha chiamato btnUpload . Poi ho modificato le impostazioni di ActionScript e aggiunto il mio c: \ lib cartella al classpath. Poi ho dato il documento un nome di classe di Uploader e salvato il file.

Successivamente, ho creato un file ActionScript e ha aggiunto il seguente codice a esso:

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

Ho salvato questo file accanto al FLA con il nome di Uploader.as .

ho pubblicato il file SWF nella root del mio sito Asp.NET. Questo codice presuppone che si desidera caricare il jpeg con una qualità del 100% e che lo script che riceverà i dati si chiama Upload.aspx e si trova nella directory principale del sito.

ASP.NET

Nella radice del mio sito ho creato un WebForm denominato Upload.aspx. Nel file aspx, ho rimosso tutti i contenuti a parte la direttiva di pagina. E 'sguardo contenuti in questo modo:

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

Poi, nel codebehind, ho aggiunto quanto segue:

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

Ci sono, ovviamente, i valori hard-coded come ad esempio il percorso di salvataggio, ma da questo si dovrebbe essere in grado di creare qualsiasi sistema si richiedono.

Altri suggerimenti

Se avete bisogno di manipolare l'immagine, fino a quando si può ottenere un byte [] o un flusso del file inviato, è possibile creare un'immagine di esso, per es.

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

Lo hanno postare il file come un normale form HTML.È possibile accedere a tali file nell'evento Page_Load della pagina che sta postando utilizzando la seguente raccolta

Richiesta.File

Questo restituirà una raccolta di HttpPostedFiles proprio come quello che un controllo FileUpload fa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top