Как передать изображение из Flash в ASP.NET? - PullRequest
7 голосов
/ 30 мая 2009

Быстрая версия:

Как вернуть изображение, сгенерированное в браузере пользователя, обратно на сервер?

Текущий план такой:

  1. Разработчик Flash преобразует растровое изображение в JPEG
  2. Затем он разместит JPEG на странице сайта.
  3. Я думаю, что могу создать WebService, который будет использовать StreamReader, чтобы прочитать сообщение и сохранить его в виде файла.

Это сработает? Любой существующий код / ​​примеры для этого?

Полагаю, мы должны иметь возможность посмотреть код для загрузки любого файла в ASP.NET.

Ответы [ 3 ]

13 голосов
/ 06 ноября 2009

В этом примере я создал файл Flash с кнопкой на сцене. Когда вы нажимаете эту кнопку, Flash отправляет изображение кнопки в файл ASPX, который сохраняет его в формате JPEG. Как вы увидите, это делается путем рисования DisplayObject в объекте BitmapData, и поэтому вы можете легко заменить ссылку на кнопку на что-либо, что наследуется от DisplayObject (включая фрагмент ролика, содержащий холст для нанесения краски и т. д.).

Сначала я расскажу о элементе Flash, а затем о бэкэнде .NET.

Flash

Чтобы отправить сгенерированное изображение, подобное этому, из Flash в ASP.NET (или любой другой бэкэнд), вам понадобится пара сторонних библиотек. Нам понадобится кодировщик JPEG (которого нет во Flash, но есть в последних версиях Flex), который мы можем получить от AS3 Core Lib http://code.google.com/p/as3corelib/. Нам также понадобится кодер base64 для отправки данных через провод. Я буду использовать один из Dynamic Flash, доступный в http://dynamicflash.com/goodies/base64/.

Загрузите их и извлеките их где-нибудь на вашем жестком диске (например, в папку C: \ lib).

Я создал новый файл AS3 Flash и сохранил его как uploader.fla . Я добавил компонент кнопки на сцену и назвал его btnUpload . Затем я отредактировал настройки ActionScript и добавил папку c: \ lib в путь к классам. Затем я дал документу имя класса Uploader и сохранил файл.

Затем я создал файл ActionScript и добавил в него следующий код:

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

Я сохранил этот файл рядом с FLA с именем Uploader.as .

Я опубликовал SWF в корне моего сайта Asp.NET. В этом коде предполагается, что вы хотите загрузить jpeg с качеством 100%, а сценарий, который будет принимать данные, называется upload.aspx и находится в корне сайта.

ASP.NET

В корне моего сайта я создал веб-форму с именем upload.aspx. В файле .aspx я удалил все содержимое, кроме директивы страницы. Это выглядит так:

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

Затем в CodeBehind я добавил следующее:

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

Очевидно, что есть жестко запрограммированные значения, такие как путь сохранения, но из этого вы сможете создать любую систему, которая вам нужна.

1 голос
/ 02 июня 2009

Если вам нужно манипулировать изображением, если вы можете получить байт [] или поток файла POSTed, вы можете создать его изображение, например,

MemoryStream mstr = new MemoryStream(myByteArray);
Image myImage = Image.FromStream(mstr);
0 голосов
/ 30 мая 2009

Пусть он разместит файлы как стандартную HTML-форму. Вы можете получить доступ к этим файлам в событии Page_Load на странице, которую он публикует, используя следующую коллекцию

Request.Files

Это вернет коллекцию HttpPostedFiles точно так же, как и элемент управления FileUpload.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...