MVC3.0下实现FLASH异步上传并且实现上传照片,截取头像.

 

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>UserInfo</title>
    <script type="text/javascript">
        function $(id) {
            return document.getElementById(id);
        }
        var userAgent = navigator.userAgent.toLowerCase();
        var is_opera = userAgent.indexOf('opera') != -1 && opera.version();
        var is_moz = (navigator.product == 'Gecko') && userAgent.substr(userAgent.indexOf('firefox') + 8, 3);
        var is_ie = (userAgent.indexOf('msie') != -1 && !is_opera) && userAgent.substr(userAgent.indexOf('msie') + 5, 3);
        var is_mac = userAgent.indexOf('mac') != -1;
        function AC_GetArgs(args, classid, mimeType) {
            var ret = new Object();
            ret.embedAttrs = new Object();
            ret.params = new Object();
            ret.objAttrs = new Object();
            for (var i = 0; i < args.length; i = i + 2) {
                var currArg = args[i].toLowerCase();
                switch (currArg) {
                    case "classid": break;
                    case "pluginspage": ret.embedAttrs[args[i]] = 'http://www.macromedia.com/go/getflashplayer'; break;
                    case "src": ret.embedAttrs[args[i]] = args[i + 1]; ret.params["movie"] = args[i + 1]; break;
                    case "codebase": ret.objAttrs[args[i]] = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0'; break;
                    case "onafterupdate":
                    case "onbeforeupdate":
                    case "onblur":
                    case "oncellchange":
                    case "onclick":
                    case "ondblclick":
                    case "ondrag":
                    case "ondragend":
                    case "ondragenter":
                    case "ondragleave":
                    case "ondragover":
                    case "ondrop":
                    case "onfinish":
                    case "onfocus":
                    case "onhelp":
                    case "onmousedown":
                    case "onmouseup":
                    case "onmouseover":
                    case "onmousemove":
                    case "onmouseout":
                    case "onkeypress":
                    case "onkeydown":
                    case "onkeyup":
                    case "onload":
                    case "onlosecapture":
                    case "onpropertychange":
                    case "onreadystatechange":
                    case "onrowsdelete":
                    case "onrowenter":
                    case "onrowexit":
                    case "onrowsinserted":
                    case "onstart":
                    case "onscroll":
                    case "onbeforeeditfocus":
                    case "onactivate":
                    case "onbeforedeactivate":
                    case "ondeactivate":
                    case "type":
                    case "id": ret.objAttrs[args[i]] = args[i + 1]; break;
                    case "width":
                    case "height":
                    case "align":
                    case "vspace":
                    case "hspace":
                    case "class":
                    case "title":
                    case "accesskey":
                    case "name":
                    case "tabindex": ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i + 1]; break;
                    default: ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i + 1];
                }
            }
            ret.objAttrs["classid"] = classid;
            if (mimeType) {
                ret.embedAttrs["type"] = mimeType;
            }
            return ret;
        }
        function AC_FL_RunContent() {
            var ret = AC_GetArgs(arguments, "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000", "application/x-shockwave-flash");
            var str = '';
            if (is_ie && !is_opera) {
                str += '<object ';
                for (var i in ret.objAttrs) {
                    str += i + '="' + ret.objAttrs[i] + '" ';
                }
                str += '>';
                for (var i in ret.params) {
                    str += '<param name="' + i + '" value="' + ret.params[i] + '" /> ';
                }
                str += '</object>';
            } else {
                str += '<embed ';
                for (var i in ret.embedAttrs) {
                    str += i + '="' + ret.embedAttrs[i] + '" ';
                }
                str += '></embed>';
            }
            return str;
        }
    </script>
</head>
<body>
    <div id="mainBody">
        <input type="hidden" id="avatarp" value="@ViewBag.avatar" />
        <input type="hidden" id="uid" value="@ViewBag.uid" />
        <input type="hidden" id="Localhost" value="@ViewBag.Localhost" />
        <input type="hidden" id="EncodeLocalhost" value="@ViewBag.EncodeLocalhost" />
        
        <div class="">
            <div >
                <img id="avatar" onerror="this.onerror=null;this.src='/images/upload/avatars/noavatar_medium.gif';" />
            </div>
            <div>
                <a href="javascript:;" onclick="$('avatarctrl').style.display = ''">Flash头像</a>
            </div>
        </div>
        <div>
            <div id="avatarctrl" style="display: none">
                <script type="text/javascript">
                    var avatarp = document.getElementById("avatarp").value;
                    document.write(AC_FL_RunContent(
                    'width', '500', 'height', '253', 'scale',
                    'exactfit', 'src', avatarp,
                    'id', 'mycamera', 'name', 'mycamera', 'quality',
                    'high', 'bgcolor', '#ffffff', 'wmode', 'transparent',
                    'menu', 'false', 'swLiveConnect', 'true', 'allowScriptAccess',
                    'always'));
                </script>
            </div>
            <script type="text/javascript">                               
                var Localhost= document.getElementById("Localhost").value;
                var uid= document.getElementById("uid").value;
                function updateavatar(sender, args) {

                    $('avatar').src = Localhost+'/images/upload/avatars/'+uid+'/medium.jpg?random=1' + Math.random();
                    $('avatarctrl').style.display = 'none';
                }
                updateavatar();
            </script>
        </div>
   
    </div>
   
</body>
</html>

这是ACTION

public ActionResult UserInfo()
        {
            string avatarFlashParam;
            string EncodeLocalhost;
            string Localhost;
            string uid;
            int port = HttpContext.Request.Url.Port;
            string ApplicationPath = HttpContext.Request.ApplicationPath != "/" ? HttpContext.Request.ApplicationPath : string.Empty;
            uid = "1";
            Localhost = string.Format("{0}://{1}{2}{3}",
                                 HttpContext.Request.Url.Scheme,
                                 HttpContext.Request.Url.Host,
                                 (port == 80 || port == 0) ? "" : ":" + port,
                                 ApplicationPath);
            EncodeLocalhost = HttpUtility.UrlEncode(Localhost);
            avatarFlashParam = string.Format(
                "{0}/images/common/camera.swf?nt=1&inajax=1&appid=1&input={1}&ucapi={2}/Ajax.ashx", Localhost, uid, EncodeLocalhost);
            ViewBag.avatar = avatarFlashParam;
             ViewBag.uid =1;
             ViewBag.Localhost = Localhost;
             ViewBag.EncodeLocalhost = EncodeLocalhost;
             ViewBag.Port = 80;
            return View();
        }

这是HttpHandler页面,处理上传.这里也可以写在CONTROLLER里面

<%@ WebHandler Language="C#" class="Ajax" %>

using System;
using System.Web;
using System.IO;

    public class Ajax : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            string url = context.Request.Url.ToString();
            string uid = context.Request.QueryString["input"];
            if (!string.IsNullOrEmpty(context.Request["Filename"]) && !string.IsNullOrEmpty(context.Request["Upload"]))
            {
                ResponseText(UploadTempAvatar(uid));
            }
            if (!string.IsNullOrEmpty(context.Request["avatar1"]) && !string.IsNullOrEmpty(context.Request["avatar2"]) && !string.IsNullOrEmpty(context.Request["avatar3"]))
            {

                CreateDir(uid);
                if (!(SaveAvatar("avatar1", uid) && SaveAvatar("avatar2", uid) && SaveAvatar("avatar3", uid)))
                {
                    File.Delete(GetMapPath("images\\upload\\avatars\\" + uid + ".jpg"));
                    ResponseText("<?xml version=\"1.0\" ?><root><face success=\"0\"/></root>");
                    return;
                }
                File.Delete(GetMapPath("images\\upload\\avatars\\" + uid + ".jpg"));
                ResponseText("<?xml version=\"1.0\" ?><root><face success=\"1\"/></root>");
                return;
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        private void CreateDir(string uid)
        {
            string avatarDir = string.Format("images/upload/avatars/{0}",
                 uid);
            if (!Directory.Exists(GetMapPath(avatarDir)))
                Directory.CreateDirectory(GetMapPath(avatarDir));
        }

        private void ResponseText(string text)
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Write(text);
            HttpContext.Current.Response.End();
        }

        private string UploadTempAvatar(string uid)
        {
            string filename = uid + ".jpg";
            string uploadUrl = GetRootUrl("images/") + "upload/avatars";
            string uploadDir = GetMapPath("images\\upload\\avatars");
            if (!Directory.Exists(uploadDir + "temp\\"))
                Directory.CreateDirectory(uploadDir + "temp\\");

            filename = "temp/" + filename;
            if (HttpContext.Current.Request.Files.Count > 0)
            {
                HttpContext.Current.Request.Files[0].SaveAs(uploadDir + filename);
            }

            return uploadUrl + filename;
        }

        private byte[] FlashDataDecode(string s)
        {
            byte[] r = new byte[s.Length / 2];
            int l = s.Length;
            for (int i = 0; i < l; i = i + 2)
            {
                int k1 = ((int)s[i]) - 48;
                k1 -= k1 > 9 ? 7 : 0;
                int k2 = ((int)s[i + 1]) - 48;
                k2 -= k2 > 9 ? 7 : 0;
                r[i / 2] = (byte)(k1 << 4 | k2);
            }
            return r;
        }

        private bool SaveAvatar(string avatar, string uid)
        {
            byte[] b = FlashDataDecode(HttpContext.Current.Request[avatar]);
            if (b.Length == 0)
                return false;
            string size = "";
            if (avatar == "avatar1")
                size = "large";
            else if (avatar == "avatar2")
                size = "medium";
            else
                size = "small";
            string avatarFileName = string.Format("images/upload/avatars/{0}/{1}.jpg",
                uid, size);
            FileStream fs = new FileStream(GetMapPath(avatarFileName), FileMode.Create);
            fs.Write(b, 0, b.Length);
            fs.Close();
            return true;
        }

        public static string GetRootUrl(string forumPath)
        {
            string ApplicationPath = HttpContext.Current.Request.ApplicationPath != "/" ? HttpContext.Current.Request.ApplicationPath : string.Empty;
            int port = HttpContext.Current.Request.Url.Port;
            return string.Format("{0}://{1}{2}{3}/{4}",
                                 HttpContext.Current.Request.Url.Scheme,
                                 HttpContext.Current.Request.Url.Host,
                                 (port == 80 || port == 0) ? "" : ":" + port,
                                 ApplicationPath,
                                 forumPath);
        }

        public static string GetMapPath(string strPath)
        {
            if (HttpContext.Current != null)
            {
                return HttpContext.Current.Server.MapPath(strPath);
            }
            else 

            {
                strPath = strPath.Replace("/", "\\");
                if (strPath.StartsWith("\\"))
                {
                    strPath = strPath.Substring(strPath.IndexOf('\\', 1)).TrimStart('\\');
                }
                return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
            }
        }
    }

posted @ 2011-11-14 23:07  orient22  阅读(720)  评论(7编辑  收藏  举报