大概半年前,由于某个网站项目需要整合Discuz!NT,就粗略的用了一下。觉得里面的会员上传头像功能方便好用,而且支持摄像头,就把它的代码分离出来,以后用在需要的地方。

  

  用过Discuz!NT的朋友会知道,这个上传头像功能有两个版本,一个是 Flash版,另一个是 Silverlight版,这次主要是关于 Flash版。

  要使用这个功能十分简单(最难地方才是那个Flash的代码)。

  使用页面 Default.aspx 代码

代码

<% @ Page Language = " C# " AutoEventWireup = " true " CodeFile = " Default.aspx.cs " Inherits = " Avatar.Default " %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < html xmlns ="http://www.w3.org/1999/xhtml" > < head runat ="server" > < title ></ 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 > < form id ="form1" runat ="server" > < table cellspacing ="0" cellpadding ="0" > < tbody > < tr > < th ></ th > < td > < div class ="avatararea" > < p >< img id ="avatar" onerror ="this.οnerrοr=null;this.src='/images/upload/avatars/noavatar_medium.gif';" /></ p > < p >< a href ="javascript:;" onclick ="$('avatarctrl').style.display = ''" > Flash头像 </ a > </ p > </ div > < div id ="avatarctrl" style ="display: none" > < script type ="text/javascript" > document.write(AC_FL_RunContent( ' width ' , ' 540 ' , ' height ' , ' 253 ' , ' scale ' , ' exactfit ' , ' src ' , ' <% =avatarFlashParam %> ' , ' id ' , ' mycamera ' , ' name ' , ' mycamera ' , ' quality ' , ' high ' , ' bgcolor ' , ' #ffffff ' , ' wmode ' , ' transparent ' , ' menu ' , ' false ' , ' swLiveConnect ' , ' true ' , ' allowScriptAccess ' , ' always ' )); </ script > </ div > < script type ="text/javascript" > function updateavatar(sender, args) {
$(
' avatar ' ).src = ' <%=Localhost %>/images/upload/avatars/<%=uid %>/medium.jpg?random=1 ' + Math.random();
$(
' avatarctrl ' ).style.display = ' none ' ;
}
updateavatar();
</ script > </ td > </ tr > </ tbody > </ table > </ form > </ body > </ html >

  

  .cs代码

代码

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Avatar
{
public partial class Default : System.Web.UI.Page
{
protected string avatarFlashParam; protected string EncodeLocalhost; protected string Localhost; protected string uid; protected void Page_Load( object sender, EventArgs e)
{
int port = HttpContext.Current.Request.Url.Port; string ApplicationPath = HttpContext.Current.Request.ApplicationPath != " / " ? HttpContext.Current.Request.ApplicationPath : string .Empty;
uid
= " 1 " ;
Localhost
= string .Format( " {0}://{1}{2}{3} " ,
HttpContext.Current.Request.Url.Scheme,
HttpContext.Current.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);
}
}
}

  关键的部分是各个文件的路径,uid是会员的ID,存放会员头像的文件夹名。

Ajax.ashx的代码

代码

<% @ WebHandler Language = " C# " Class = " Ajax " %> using System; using System.Web; using System.IO; public class Ajax : IHttpHandler { public void ProcessRequest (HttpContext context) { 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 // 非web程序引用 {
strPath
= strPath.Replace( " / " , " \\ " ); if (strPath.StartsWith( " \\ " ))
{
strPath
= strPath.Substring(strPath.IndexOf( ' \\ ' , 1 )).TrimStart( ' \\ ' );
}
return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
}
}
}

  关键的部分是存放头像的路径。这个flash最终会生成 3个大,中,小的头像,如果只需要保存其中一个

if ( ! string .IsNullOrEmpty(context.Request[ " avatar1 " ]) && ! string .IsNullOrEmpty(context.Request[ " avatar2 " ]) && ! string .IsNullOrEmpty(context.Request[ " avatar3 " ]))

  可以修改这里的代码。

  如果flash 提示 I/0 错误,都是路径的问题。

  总结:flash版的使用相对于silverlight版要简单得多,改动较小,只需修改cs代码,但功能也少(有能力的朋友可以扩展那个 swf的功能)。

   代码下载 http://files.cnblogs.com/geass/Avatar.rar   项目是用 2010,没有的朋友可以单独复制里面的文件。

转载于:https://www.cnblogs.com/geass/archive/2010/10/06/1844687.html

在项目中使用 Discuz!NT的上传头像功能相关推荐

  1. php拍视频上传,php视频拍照上传头像功能实现代码分享

    现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,既不是post传递也不是get函数传递,这个另外一种数据 如果要在php中实现视频拍照我们需要借助于 ...

  2. php更换wordpress用户头像,WordPress如何添加用户自定义上传头像功能

    使用WordPress建站的朋友应该知道,WordPress本身是没有上传自定义头像功能的,如果要更换头像,步骤是非常麻烦的. 而在我们开发一款WordPress主题中,特别是多用户的主题,让注册用户 ...

  3. php拍照,php视频拍照上传头像功能实现代码分享

    php视频拍照上传头像功能实现代码分享 发布于 2016-01-19 07:47:53 | 121 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...

  4. flask上传头像功能

    上传头像功能只需要以下N步: 首先我们要从HTML中获取头像文件 获取后,传入视图函数 # user.py # 修改用户头像功能 @user_blu.route("/user/avatar& ...

  5. php上传头像的代码,php视频拍照上传头像功能实现代码分享

    如果要在php中实现视频拍照我们需要借助于flash插件了,由flash拍出的确照片我们再通过php的$GLOBALS ['HTTP_RAW_POST_DATA']接受数据,然后保存成图片就可以了,下 ...

  6. Discuz论坛无法上传头像/ 企业邮箱被归为垃圾邮件的问题

    背景: 安装了Discuz论坛程序,更改个人头像的时候,点击上传按钮没有反应 基于阿里云企业邮箱配置了论坛的邮件发送服务,但是邮箱被列入垃圾邮件拒收 解决方法: 上传头像失败:ucenter和全局域名 ...

  7. ajax实现上传头像功能,网络编程Ajax实现注册并选择头像后上传功能

    在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册用户这一项,但是都忽略掉了一个功能,那就是,很多网站的注册是可以上传头像的,在这里我做了一个在已有的头像数组里选择图片上传作头像的 ...

  8. 完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)

    现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像. 一.相关技术 若要实现上述的自拍头像和上传头像的功能,会碰到 ...

  9. 基于elementUI+nodejs+mysql实现用户注册功能以及上传头像功能

    主要使用elmentui的组件库,封装了上传组件,实现了上传时隐藏上传框,重置和删除时显示上传框(可以加点显示隐藏的动画),使用multer将上传的图片保存在服务器中,再将获取到的字段存入数据库 效果 ...

最新文章

  1. 高效、稳定开发功能的一些心得
  2. 3D渲染集群,听说过吗?
  3. mysql客户端登陆提示client option 'secure_auth' enabled错误
  4. “鸡肋”的百度,掉队了 BAT? | 畅言
  5. netty实战pdf下载,深度解密:Java与线程的关系
  6. win10提高开机速度只需要5步
  7. 多年未用photoshop后,我忘记了p图(将黑底图片修改为白底)
  8. 如何将图片转换成JPG图片格式?如何将照片转换为jpg?
  9. Linux的.a、.so和.o文件以及与windows下的对应关系
  10. 分类classify
  11. Lifecycle使用篇
  12. P2P-资金存管系统充值业务流程
  13. 快速掌握python3语法_【Python】Python3基本语法入门学习
  14. 基于物联网技术和RFID电子客票的铁路自动检票机
  15. 基于STM32单片机的ILI9341液晶屏驱动protues仿真
  16. Eureka搭建三台集群
  17. 中联重科智慧产业城项目启动 千亿元投资打造全球典范
  18. 推荐个程序员找女朋友的网站
  19. 河南中小学教师计算机提高培训,河南中小学教师信息技术应用能力提升工程县校级管理团队集中培训...
  20. 成功创业者的十大素质

热门文章

  1. AutoCAD2021 下载及安装教程
  2. 汽车编程都是用matlab,汽车理论和.matlab编程答案.doc
  3. Android App开发实战项目之购物车(附源码 超详细必看)
  4. Linux nvme驱动分析之块设备层
  5. 近端串扰NEXT和远端串扰FEXT的ADS仿真
  6. 《深度学习,统计学习,数学基础》人工智能算法工程师手册
  7. 基于comsol软件弯曲单模光纤模拟仿真
  8. 软件设计师教程(四)程序设计语言基础知识
  9. python舔狗学习日记第三期【帮女神自动化生成日报】
  10. 12个爆款 Java 开源项目