Comment passer d'une image de Flash à ASP.NET?
-
06-09-2019 - |
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:
- Le développeur Flash convertit le bitmap au format JPEG
- Il sera alors le POST JPEG à une page sur le site.
- Je pense que je peux créer un
WebService
qui utilisera unStreamReader
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.
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.