سؤال

النسخة السريعة:

كيف يمكنني الحصول على صورة تم إنشاؤها على متصفح المستخدمين العودة إلى الخادم؟

الخطة الحالية هي:

  1. سوف يقوم مطور الفلاش بتحويل الصورة النقطية إلى JPEG
  2. سيقوم بعد ذلك بنشر JPEG إلى صفحة على الموقع.
  3. أنا أفكر يمكنني إنشاء WebService والتي سوف تستخدم StreamReader لقراءة المنشور وحفظه كملف.

هل هذا يعمل؟ أي رمز / عينات موجودة للقيام بذلك؟

أفترض أننا يجب أن نكون قادرين على النظر في التعليمات البرمجية للقيام بأي تحميل ملف إلى ASP.NET.

هل كانت مفيدة؟

المحلول

في هذا المثال، قمت بإنشاء ملف فلاش مع زر على المسرح. عند النقر فوق الزر هذا الزر، يرسل الفلاش صورة الزر إلى ملف ASPX ينقذه ك jpeg. كما سترى هذا يتم عن طريق رسم DisplayObject الى BitmapData كائن وبالتالي، يمكنك بسهولة استبدال المرجع إلى الزر بأي شيء يرث من DisplayObject (بما في ذلك مقطع فيلم يحتوي على قماش لتطبيق الطلاء وما إلى ذلك).

سوف أمشي لك من خلال عنصر الفلاش أولا ثم Backend .NET.

فلاش

لإرسال صورة تم إنشاؤها مثل هذا من Flash إلى ASP.NET (أو أي خلفية أخرى) ستحتاج إلى اثنين من مكتبات الطرف الثالث. سنحتاج إلى تشفير JPEG (الذي لا يحتوي فلاش، ولكن الإصدارات الأخيرة من Flex Do) التي يمكننا الوصول إليها من AS3 Core Lib http://code.google.com/p/as3corelib/. وبعد سنحتاج أيضا إلى تشفير Base64 لإرسال البيانات عبر السلك. سأستخدم واحد من فلاش ديناميكي، متاح في http://dynamicflash.com/goodies/base64/.

قم بتنزيل هذه واستخراجها في مكان ما معقولة على القرص الثابت الخاص بك (مثل مجلد C: Lib).

قمت بإنشاء ملف فلاش AS3 جديد وحفظه uploader.fla.. وبعد أضفت مكون زر إلى المرحلة واسمها btnupload. وبعد بعد ذلك قمت بتحرير إعدادات ActionScript وأضاف ج: ليب مجلد إلى classpath. ثم أعطيت الوثيقة اسم الفصل تحميل وحفظ الملف.

بعد ذلك، قمت بإنشاء ملف 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.

في جذر موقع الويب الخاص بي، قمت بإنشاء WebForm اسمه 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");
    }
}

من الواضح أن هناك قيم صعبة للغاية مثل حفظ المسار ولكن من هذا يجب أن تكون قادرا على إنشاء أي نظام تحتاجه.

نصائح أخرى

إذا كنت بحاجة إلى معالجة الصورة، طالما يمكنك الحصول على بايت [] أو دفق من الملف المنشور، فيمكنك إنشاء صورة منه، على سبيل المثال

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

اطلب منه نشر الملفات مثل نموذج HTML قياسي. يمكنك الوصول إلى هذه الملفات في حدث Page_Load في الصفحة التي ينشرها باستخدام المجموعة التالية

طلب

سيؤدي ذلك إلى إرجاع مجموعة من httpPostEdfiles تماما مثل عنصر تحكم fileupload.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top