您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz的NT上传头像功能使用方法
敦厦2025-06-27Discuz教程已有人查阅
导读大概半年前,由于某个网站项目需要整合Discuz!NT,就粗略的用了一下。觉得里面的会员上传头像功能方便好用,而且支持摄像头,就把它的代码分离出来,以后用在需要的地方。
大概半年前,由于某个网站项目需要整合Discuz!NT,就粗略的用了一下。觉得里面的会员上传头像功能方便好用,而且支持摄像头,就把它的代码分离出来,以后用在需要的地方。
用过Discuz!NT的朋友会知道,这个上传头像功能有两个版本,一个是 Flash版,另一个是 Silverlight版,这次主要是关于 Flash版。
要使用这个功能十分简单(最难地方才是那个Flash的代码)。
使用页面 Default.aspx
Ajax.ashx的代码
如果flash 提示 I/0 错误,都是路径的问题。
总结:flash版的使用相对于silverlight版要简单得多,改动较小,只需修改cs代码,但功能也少(有能力的朋友可以扩展那个 swf的功能)。
用过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:// .w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http:// .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.toLowerCase();
switch (currArg) {
case "classid": break;
case "pluginspage": ret.embedAttrs[args] = 'http:// .macromedia.com/go/getflashplayer'; break;
case "src": ret.embedAttrs[args] = args[i + 1]; ret.params["movie"] = args[i + 1]; break;
case "codebase": ret.objAttrs[args] = '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] = 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] = ret.objAttrs[args] = args[i + 1]; break;
default: ret.embedAttrs[args] = ret.params[args] = 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 + '" ';
}
str += '>';
for (var i in ret.params) {
str += '<param name="' + i + '" value="' + ret.params + '" /> ';
}
str += '</object>';
} else {
str += '<embed ';
for (var i in ret.embedAttrs) {
str += i + '="' + ret.embedAttrs + '" ';
}
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.onerror=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) - 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的功能)。
本文标签:
很赞哦! ()
相关教程
图文教程
discuz论坛更换域名搬家的步骤方法
搬家步骤具体如下:1、打包数据库文件保存到本地。2、打包网站根目录所有程序(discuz)保存到本地。3、上传网站程序包和数据库包到新的空间,将数据库上传到新的服务器中。
Windows快速搭建Discuz论坛的步骤方法
在.Net领域,比较优秀的论坛有Community Server,yetanotherforums,CVBBS等等。在php领域,优秀的论坛有phpwind,phpbb,Discuz,vBulletin等等
离线环境下Discuz安装包的部署与配置方法
在离线环境中,我们需要确保所有依赖的软件版本与Discuz的兼容性,这一点非常关键。同时,我们还需要了解如何在没有网络的情况下进行软件的安装和配置,这通常需要一些手动操作和技巧。
Discuz开发移动端访客功能的实现步骤
discuz在移动端的功能着实很简单基本就几个页面就完了,pc端的很多功能都没事实现,尤其是个人空间页面,移动端简直没有任何操做可言。
相关源码
-
帝国cms7.5模板情感文学名言名句心情文章类源码下载带手机本模板基于帝国CMS7.5开发,为情感文学类网站设计。整体风格温馨雅致,布局合理清晰,特别适合建设情书分享、文学作品展示类网站。模板采用响应式设计,能够自动适配各种终端设备。查看源码 -
(自适应)个人图集图片相册画册pbootcms网站模板源码本模板基于PbootCMS系统开发,为图片展示类网站设计,特别适合个人作品集、摄影画册、艺术图集等内容展示。采用响应式布局技术,确保各类图片在不同设备上查看源码 -
(自适应响应式)蓝色外贸英文产品介绍展示网站模板本模板采用手工编写的DIV+CSS架构,代码精简高效。适配手机端浏览,数据实时同步更新。内置SEO优化框架,支持独立设置各页面标题、关键词及描述。开源代码结构清晰,便于二次开发。查看源码 -
帝国CMS7.5H5小游戏模板游戏攻略下载网整站源码本模板基于帝国CMS系统开发,为H5小游戏和APP应用资讯类网站设计。模板架构针对小游戏行业特点优化,支持游戏发布、资讯分享、应用推荐等功能,满足各类小游戏门户网站的建设需求。查看源码 -
帝国cms7.5模板生活常识美食女性时尚综合资讯门户源码本模板为帝国cms7.5生活资讯类网站设计,以天奇生活网为参考原型,涵盖生活常识、美食烹饪、女性时尚等多元化内容板块。采用响应式布局设计,适配各种终端设备,为访客提供优质的阅读体验。模板结构清晰合理,内容展示层次分明,符合生活类网站的用户需求。查看源码 -
(自适应)绿色宠物门诊兽医行业网站模板该绿色清爽风格网站模板专为宠物门诊与兽医诊所设计,基于PbootCMS内核开发,采用响应式布局确保手机、PC等多端体验一致,帮助宠物医疗机构高效构建线上服务平台。查看源码
| 分享笔记 (共有 篇笔记) |
