Pergunta

Versão rápida:

Como faço para obter uma imagem que foi gerado na parte traseira usuários do navegador para o servidor?

O plano atual é a seguinte:

  1. O desenvolvedor Flash irá converter o bitmap para JPEG
  2. Ele, então, postar o JPEG a uma página no site.
  3. Eu estou pensando que pode criar um WebService que irá usar um StreamReader para ler o post e guardá-lo como um arquivo.

Será que isso funciona? Qualquer código / amostras existentes para fazer isso?

Suponho que deve ser capaz de olhar para o código para fazer qualquer upload do arquivo para ASP.NET.

Foi útil?

Solução

Neste exemplo, eu criei um arquivo Flash com um botão no palco. Quando você clica nesse botão, o Flash envia a imagem do botão para um arquivo ASPX que salva-lo como um JPEG. Como você verá isso é feito por desenho do DisplayObject em um objeto BitmapData e, como tal, você pode facilmente substituir a referência ao botão com qualquer coisa que herda de DisplayObject (incluindo um clipe de filme que contém a tela para uma aplicação de pintura etc) .

Eu vou levá-lo através do elemento flash primeiro e depois o backend NET.

Flash

Para enviar uma imagem gerada como esta do Flash para ASP.NET (ou qualquer outro backend), você vai precisar de um par de bibliotecas 3o partido. Vamos precisar de um JPEG Encoder (que o Flash não tem, mas versões recentes do Flex fazer) que nós podemos começar a partir do AS3 Núcleo Lib http://code.google.com/p/as3corelib/ . Nós também precisará de um codificador Base64 para enviar os dados ao longo do fio. Vou usar a da Dinâmica Flash, disponível em http://dynamicflash.com/goodies/base64/ .

Baixe estes e extraí-los em algum lugar sensível no seu disco rígido (como um C: \ lib pasta).

Eu criei um novo arquivo Flash AS3 e salva-lo como uploader.fla . Eu adicionei um componente de botão para o palco e nomeou-o btnUpload . Em seguida eu editado as configurações do ActionScript e acrescentou minha c: \ lib pasta para o classpath. Então eu dei o documento um nome de classe de Uploader e salvou o arquivo.

Em seguida, eu criei um arquivo ActionScript e acrescentou o seguinte código a ele:

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

Eu salvou este arquivo ao lado do FLA com o nome Uploader.as .

I publicou o SWF na raiz do meu site Asp.NET. Este código assume que você deseja carregar o jpeg com uma qualidade de 100% e que o script que irá receber os dados é chamado upload.aspx e está localizado na raiz do site.

ASP.NET

Na raiz do meu site eu criei um formulário da Web chamado upload.aspx. No arquivo aspx, eu removido todo o conteúdo para além da diretiva de página. É de olhar o conteúdo como este:

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

Em seguida, no CodeBehind, eu adicionei o seguinte:

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

Existem, obviamente, valores codificados como a salvar caminho, mas a partir desta você deve ser capaz de criar qualquer sistema que você precisa.

Outras dicas

Se você precisa manipular a imagem, desde que você pode obter um byte [] ou de um córrego do arquivo publicado, você pode criar uma imagem dele, por exemplo.

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

Ter-lhe publicar os arquivos como um formulário HTML padrão. Você pode acessar esses arquivos no evento Page_Load da página que está postando usando o seguinte coleção

Request.Files

Isso irá retornar uma coleção de HttpPostedFiles assim como o que um controle FileUpload faz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top