Frage

Kurze Version:

Wie bekomme ich ein Bild, das auf dem Browser des Benutzers an den Server zurück erzeugt wurde?

Der aktuelle Plan ist dies:

  1. Der Flash-Entwickler wird die Bitmap in JPEG
  2. konvertieren
  3. Er wird dann poste das JPEG auf eine Seite, auf der Website.
  4. Ich denke, ich kann eine WebService schaffen, die eine StreamReader verwenden, um die Post zu lesen und als Datei speichern.

Würde das funktionieren? Alle vorhandenen Code / samples, dies zu tun?

Ich denke, wir sollten dafür eine beliebige Datei-Upload zu ASP.NET auf Code aussehen können.

War es hilfreich?

Lösung

In diesem Beispiel habe ich eine Flash-Datei mit einem Knopf auf der Bühne erstellt. Wenn Sie auf diese Schaltfläche klicken, sendet das Flash das Bild der Schaltfläche auf eine ASPX-Datei, die es als JPEG gespeichert werden. Wie Sie dies sehen werden durch Ziehen des DisplayObject in ein BitmapData Objekt und als solches geschehen ist, können Sie ganz einfach den Verweis auf die Schaltfläche mit etwas ersetzen, das von DisplayObject erbt (einschließlich einem Videoclip, der die Leinwand für einen Farbauftrag usw. enthält) .

Ich werde Sie durch das Element Flash-zu Fuß zuerst und dann dem .NET-Backend.

Flash-

Um ein Bild erzeugt, wie dies aus dem Flash zu ASP.NET (oder einen anderen Backend) senden Sie gehen ein paar 3rd-Party-Bibliotheken zu müssen. Wir brauchen einen JPEG-Encoder (die Flash-nicht hat, aber die jüngsten Versionen von Flex zu tun), die wir von dem AS3-Core Lib http://code.google.com/p/as3corelib/ . Wir werden auch einen Base64 Encoder benötigen, um die Daten über die Leitung für das Senden. Ich werde ein Bruder von dynamischen Flash verfügbar verwenden unter http://dynamicflash.com/goodies/base64/ .

Herunterladen diese und extrahieren Sie sie auf Ihrer Festplatte irgendwo sinnvoll (wie ein C: \ lib-Ordner).

Ich habe eine neue AS3 Flash-Datei und gespeichert als uploader.fla . Ich habe eine Button-Komponente auf die Bühne und nannte es btnUpload . Als nächstes bearbeiten ich die Actionscript-Einstellungen und hinzugefügt meinen c: \ lib Ordner in den Classpath. Dann gab ich das Dokument einen Klassennamen Uploader und die Datei gespeichert.

Als nächst Ich habe eine Actionscript-Datei und hinzugefügt, um den folgenden Code hinzu:

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

ich diese Datei gespeichert neben der FLA mit dem Namen Uploader.as .

Ich veröffentlichte die SWF in die Wurzel meiner Asp.NET Website. Dieser Code wird davon ausgegangen Sie die jpeg mit einer Qualität von 100% hochladen möchten, und dass das Skript, das die Daten empfängt, ist upload.aspx genannt und ist in der Wurzel der Site befindet.

ASP.NET

In der Wurzel meiner Website habe ich ein Webformular namens upload.aspx. In der ASPX-Datei, entfernt i alle Inhalte neben der Seitendirektive. Es ist Inhalt sieht wie folgt aus:

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

Dann in der Codebehind, habe ich die folgenden:

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 gibt offensichtlich hartcodierte Werte wie den Pfad speichern, aber daraus sollten Sie in der Lage zu schaffen, was System, das Sie benötigen.

Andere Tipps

Wenn Sie das Bild manipulieren müssen, solange Sie einen byte [] oder einen Strom von der entsandte Datei erhalten können, können Sie ein Bild davon erstellen, z.

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

Haben Sie ihm die Dateien wie ein Standard-HTML-Formular erstellen. Sie können diese Dateien in dem Ereignis Page Load der Seite zuzugreifen er entsendet durch die folgende Sammlung mit

Request.Files

Dies wird eine Sammlung von HttpPostedFiles zurückkehren wie, was ein Fileupload-Steuerelement der Fall ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top