Question

Version rapide:

Comment puis-je obtenir une image qui a été généré sur le navigateur des utilisateurs au 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 le message et l'enregistrer comme un fichier.

Est-ce que ça marche? Tout code existant / échantillons pour ce faire?

Je suppose que nous devrions être en mesure de regarder le code pour faire tout transfert de fichiers vers ASP.NET.

Était-ce utile?

La solution

Dans cet exemple, j'ai créé un fichier Flash avec un bouton sur la scène. Lorsque vous cliquez sur ce bouton, Flash envoie l'image du bouton dans un fichier ASPX qui enregistre comme un JPEG. Comme vous le verrez cela se fait en tirant le DisplayObject dans un objet BitmapData et en tant que tel, vous pouvez facilement remplacer la référence au bouton avec tout ce qui hérite de DisplayObject (y compris un clip qui contient la toile pour une application de peinture, etc.) .

Je vais vous guider à travers l'élément flash d'abord, puis le back-end .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 codeur JPEG (lequel Flash ne possède pas, mais les versions récentes de Flex faire) que nous pouvons obtenir de l'AS3 de base Lib http://code.google.com/p/as3corelib/ . Nous allons également besoin d'un encodeur base64 pour envoyer les données sur le fil. Je vais utiliser celui de Dynamic Flash, disponible à http://dynamicflash.com/goodies/base64/ .

Télécharger ces derniers et les extraire quelque part raisonnable sur votre disque dur (comme un dossier C: \ lib).

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

Ensuite, j'ai créé un fichier ActionScript et a ajouté le code suivant il:

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 .

Je publiais le fichier SWF dans la racine de mon site Asp.NET. Ce code suppose que vous souhaitez télécharger le jpeg avec une qualité de 100% et que le script qui recevra les données est appelée 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 de page. Il est contenu regarder 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 être en mesure de créer ce système dont vous avez besoin.

Autres conseils

Si vous avez besoin de manipuler l'image, aussi longtemps que vous pouvez obtenir un octet [] ou un flux du fichier d'affichage, vous pouvez créer une image de celui-ci, par exemple.

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

Demandez-lui de publier 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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top