silverlight
发布时间:2022-05-04 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了DiscuzNT使用Silverlight进行多文件上传(上),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
注:本文的HTM页面均位于Discuz.Web
项目中,大家可以到官方下面最终的程序。
在
去年我曾写过一篇文章:“ 推荐一个Silverlight多文件(大文件)上传的开源项目”。之后有不少朋友询问这个项目示例在开发和配置上的一些问题。当时因为时间有限没有做过多的说明,导致有些问题在大家下载完源码之后运行时才出现。今天就以这个项目为原型,简要介绍一下在Discuz
注:本文的HTM
页面均位于Discuz.Web
项目中,大家可以到官方下面最终的程序。
当然本文中所列出的源码是通过reflector
获取并
添加相应注释的。最终的源码还是要以开放出来的为准,呵呵:)
好了,开始今天的正文吧!
首先,看一下这个
插件在DiscuzNT中的实际运行
效果:
当我们在网页中点击“批量
上传”按钮时,会运行如下JS脚本(
文件位于Discuz.Web\templates\default_postattachment
s.htm):
function
LoadSilverlight(pluginID, maX) {
Silverlight.createObject(
"
silverlight/UploadFile/ClientBin/MultiFileUpload.xap
"
,
$(
"
silverLightcontrolHost
"
),
pluginID,
{
width:
'
500
'
,
height:
'
440
'
,
inplaceInstallPrompt:
'
true
'
,
isWindowless:
'
true
'
,
BACkground:
'
transparent
'
,
version:
'
2.0
'
,
autoUpgrade:
'
true
'
},
{
onLoad: onLoad,
onError: onSilverlightError
},
<%
csharp
%>
String authToken
=
Discuz.Common.DEs.Encode(oluserinfo.olid.ToString()
+
"
,
"
+
oluserinfo.Username.ToString(), oluserinfo.password.SubString(
0
,
10
)).replace(
"
+
"
,
"
[
"
);
<%
/
csharp%>
"
forumid={forumiD},authToken={authToken},max=
"
+
max,
""
);
}
其会将当前版块id(forumid),认证Token,最大
上传数等信息以参数形式传给SL
插件,而我专门定义了
一个方法用于
获取相应的参数并绑定到sl变量,如下(Page.xam
l.cs):
///
<sumMary>
///
加载配置参数
///
</sumMary>
///
<param NAME="initParams"></param>
private
void
LoadConfiguration(IDictionary
<
String
,
String
>
initParams)
{
String
tryTest
=
String
.Empty;
//
加载定制配置信息串
_customParams
=
initParams[
"
forumid
"
];
if
(initParams.ContainsKey(
"
@H_786_339@maxUploads
"
)
&&
!
String
.IsNullOrEmpty(initParams[
"
@H_786_339@maxUploads
"
]))
int
.TryParse(initParams[
"
@H_786_339@maxUploads
"
],
out
_maxUpload);
if
(initParams.ContainsKey(
"
@H_786_339@maxFileSizeKB
"
)
&&
!
String
.IsNullOrEmpty(initParams[
"
@H_786_339@maxFileSizeKB
"
]))
{
if
(
int
.TryParse(initParams[
"
@H_786_339@maxFileSizeKB
"
],
out
_maxFileSizE))
_maxFileSize
=
_maxFileSize
*
1024
;
}
if
(initParams.ContainsKey(
"
FileFilter
"
)
&&
!
String
.IsNullOrEmpty(initParams[
"
FileFilter
"
]))
_fileFilter
=
initParams[
"
FileFilter
"
];
if
(initParams.ContainsKey(
"
forumid
"
)
&&
!
String
.IsNullOrEmpty(initParams[
"
forumid
"
]))
_forumid
=
Utils.StrToInt(initParams[
"
forumid
"
],
0
);
if
(initParams.ContainsKey(
"
@H_786_339@max
"
)
&&
!
String
.IsNullOrEmpty(initParams[
"
@H_786_339@max
"
]))
_maxAttachments
=
Utils.StrToInt(initParams[
"
@H_786_339@max
"
],
0
);
CredentialInfo _creInfo
=
Utils.GetCredentialInfo();
if
(_creInfo.UserID
<=
0
)
{
ShowmessageBox(
"
您未登陆系统
"
);
SetUploadButton(
false
);
return
;
}
else
{
MixObjectsSoapClient _client
=
Utils.CreateserviceClient();
_client.GetAttachmentUploadSetCompleted
+=
new
EventHandler
<
GetAttachmentUploadSetCompletedEventArgs
>
(_client_GetAttachmentUploadSetCompleted);
_client.GetAttachmentUploadSetAsync(_creInfo, _forumid);
}
}
大家看到在该
方法在
获取相应初始化参数(initParams)后,会
调用Util
s.GetCredentialInfo()来
获取 用户登陆信息:
///
<sumMary>
///
获取认证信息
///
</sumMary>
///
<returns></returns>
public
static
CredentialInfo GetCredentialInfo()
{
CredentialInfo _creinfo
=
new
CredentialInfo();
_creinfo.UserID
=
Utils.StrToInt(Utils.GetCookie(
"
userid
"
),
0
);
_creinfo.password
=
Utils.GetCookie(
"
password
"
);
if
(App.GeTinitParmas.ContainsKey(
"
authToken
"
)
&&
!
String
.IsNullOrEmpty(App.GeTinitParmas[
"
authToken
"
]))
_creinfo.AuthToken
=
App.GeTinitParmas[
"
authToken
"
];
if
(App.GeTinitParmas.ContainsKey(
"
forumid
"
)
&&
!
String
.IsNullOrEmpty(App.GeTinitParmas[
"
forumid
"
]))
_creinfo.ForumID
=
StrToInt(App.GeTinitParmas[
"
forumid
"
],
0
);
return
_creinfo;
}
其中最主要的就是
获取相应的UserID,而这个操作是交给GetCookie来完成的:
public
static
String
GetCookie(String key)
{
if
(
String
.IsNullOrEmpty(HtmlPage.Document.Cookies))
return
null
;
//
找到想应的cookie键值
String
result
=
(from c
in
(from cookie
in
HtmlPage.Document.Cookies.Split(
'
;
'
)
where
cookie.Contains(key
+
"
=
"
)
SELEct cookie.Split(
'
&
'
)).FirstOrDefault()
where
c.Contains(key
+
"
=
"
)
SELEct C).FirstOrDefault().ToString();
if
(
String
.IsNullOrEmpty(result))
return
null
;
return
result.SubString(result.IndexOf(key
+
"
=
"
)
+
key.Length
+
1
);
}
MixObjectsSoapClient _client
=
Utils.CreateserviceClient();
_client.GetAttachmentUploadSetCompleted
+=
new
EventHandler
<
GetAttachmentUploadSetCompletedEventArgs
>
(_client_GetAttachmentUploadSetCompleted);
_client.GetAttachmentUploadSetAsync(_creInfo, _forumid);
///
<sumMary>
///
通过指定用户认证信息来获得该用户的上传设置信息
///
</sumMary>
///
<param NAME="creinfo">
用户认证信息
</param>
///
<returns></returns>
[WebMethod]
public
UploadSeTinfo GetAttachmentUploadSet(CredentialInfo creinfo)
{
if
(AuthenticateUser(creinfo))
{
UserInfo userinfo
=
Discuz.Forum.Users.GetUserInfo(creinfo.UserID);
if
(userinfo
==
null
)
return
new
UploadSeTinfo(
""
,
""
,
0
,
false
,
"
当前用户信息无效,请尝试刷新
"
);
UserGroupInfo usergroupinfo
=
Discuz.Forum.UserGroups.GetUserGroupInfo(userinfo.Groupid);
if
(usergroupinfo
==
null
)
return
new
UploadSeTinfo(
""
,
"
当前用户所属用户组信息无效
"
);
ForumInfo forum
=
Discuz.Forum.Forums.GetForumInfo(creinfo.ForumID);
if
(forum
==
null
)
return
new
UploadSeTinfo(
null
,
null
,
"
当前版块信息无效,请尝试刷新
"
);
//
得到用户可以上传的文件类型
StringBuilder sbAttachmentTypeSELEct
=
new
StringBuilder();
if
(
!
usergroupinfo.Attachextensions.Trim().Equals(
""
))
{
sbAttachmentTypeSELEct.Append(
"
[id] in (
"
);
sbAttachmentTypeSELEct.Append(usergroupinfo.Attachextensions);
sbAttachmentTypeSELEct.Append(
"
)
"
);
}
if
(
!
forum.Attachextensions.Equals(
""
))
{
if
(sbAttachmentTypeSELEct.Length
>
0
)
sbAttachmentTypeSELEct.Append(
"
AND
"
);
sbAttachmentTypeSELEct.Append(
"
[id] in (
"
);
sbAttachmentTypeSELEct.Append(forum.Attachextensions);
sbAttachmentTypeSELEct.Append(
"
)
"
);
}
String
attachextensions
=
Discuz.Forum.Attachments.GetAttachmentTypeArray(sbAttachmentTypeSELEct.ToString());
String
attachextensionsnosize
=
Discuz.Forum.Attachments.GetAttachmentTypeString(sbAttachmentTypeSELEct.ToString());
//
得到今天允许用户上传的附件总大小(字节)
int
MaxTodaySize
=
0
;
if
(creinfo.UserID
>
0
)
MaxTodaySize
=
Discuz.Forum.Attachments.GetUploadFileSizeByuserid(creinfo.UserID);
int
attachsize
=
usergroupinfo.Maxsizeperday
-
MaxTodaySize;
//
今天可上传大小
bool
canpostattach
=
false
;
//
是否允许上传附件
//
是否有上传附件的权限
if
(Discuz.Forum.Forums.AllowPostAttachByUserID(forum.Permuserlist, creinfo.UserID))
canpostattach
=
true
;
else
{
if
(forum.Postattachperm
==
""
)
{
if
(usergroupinfo.Allowpostattach
==
1
)
canpostattach
=
true
;
}
else
{
if
(Discuz.Forum.Forums.AllowPostAttach(forum.Postattachperm, usergroupinfo.Groupid))
canpostattach
=
true
;
}
}
return
new
UploadSeTinfo(attachextensions, attachextensionsnosize, MaxTodaySize, attachsize,
canpostattach , usergroupinfo.Maxattachsize,
""
);
}
return
new
UploadSeTinfo(
""
,请尝试刷新
"
);
}
该
方法的首先会访问AuthenticateUser
方法来进行
用户身份验证:
/// <sum
Mary>
/// WEB权限认证
///
</sumMary>
///
<param NAME="creinfo">
认证信息
</param>
///
<returns>
是否通过验正
</returns>
private
bool
AuthenticateUser(CredentialInfo creinfo)
{
if
(creinfo.ForumID
>
0
)
{
int
olid
=
Discuz.Forum.OnlineUsers.GetOlidByUid(creinfo.UserID);
if
(olid
>
0
)
{
OnlineUserInfo oluserinfo
=
Discuz.Forum.OnlineUsers.GetOnlineUser(olid);
if
(oluserinfo.Userid
==
creinfo.UserID
&&
UtilS.UrlEncode(Discuz.Forum.ForumUtils.SetCookiepassword(oluserinfo.password,
GeneralConfigs.GetConfig().passwordkey))
==
creinfo.password
&&
//
检测用户id和口令
creinfo.AuthToken
==
DEs.Encode(
String
.Format(
"
{0},{1}
"
, oluserinfo.olid.ToString(),
oluserinfo.Username.ToString()), oluserinfo.password.SubString(
0
,
10
)).replace(
"
+
"
,
"
[
"
))
//
检查认证信息
{
return
true
;
}
}
}
return
false
;
}
其会对
用户的UserId与
用户在线表中的数据进行比对,以确保其信息有效,同时还会检查AuthToken来避免
用户通过伪造
用户信息来进行信息提交。当上面
方法返回TRUE时,则将对
用户所在版块的权限信息进行
获取,
并返回
一个名为UploadSe
Tinfo
类实例,其
包括:
1.用户可以上传的文件类型
2.用户可以上传的文件类型(不带上传数据大小)
3.得到今天允许用户上传的附件总大小(字节)
4.是否允许上传附件
5.单个附件大小
6.最大允许上传的附件数
7.错误信息
#region
上传设置信息类
///
<sumMary>
///
上传设置信息类
///
</sumMary>
public
class
UploadSeTinfo
{
public
UploadSeTinfo()
{ }
public
UploadSeTinfo(
String
attachExtensions,
String
attachExtensionsnoSize,
int
maxTodaySize,
int
attachSize,
bool
canPostAttach,
int
maxAttachSize,
String
errmessagE)
{
m_attachExtensions
=
attachExtensions;
m_attachExtensionsnoSize
=
attachExtensionsnoSize;
m_maxTodaySize
=
maxTodaySize;
m_attachSize
=
attachSize;
m_canPostAttach
=
canPostAttach;
m_maxAttachSize
=
maxAttachSize;
m_errmessage
=
errmessage;
m_maxAttachments
=
GeneralConfigs.GetConfig().Maxattachments;
}
private
String
m_attachExtensions;
///
<sumMary>
///
用户可以上传的文件类型
///
</sumMary>
public
String
AttachExtensions
{
get
{
return
m_attachExtensions; }
set
{ m_attachExtensions
=
value; }
}
private
String
m_attachExtensionsnoSize;
///
<sumMary>
///
用户可以上传的文件类型(不带上传数据大小)
///
</sumMary>
public
String
AttachExtensionsnoSize
{
get
{
return
m_attachExtensionsnoSize; }
set
{ m_attachExtensionsnoSize
=
value; }
}
private
int
m_maxTodaySize;
///
<sumMary>
///
得到今天允许用户上传的附件总大小(字节)
///
</sumMary>
public
int
MaxTodaySize
{
get
{
return
m_maxTodaySize; }
set
{ m_maxTodaySize
=
value; }
}
private
int
m_attachSize;
///
<sumMary>
///
今天可上传的大小
///
</sumMary>
public
int
AttachSize
{
get
{
return
m_attachSize; }
set
{ m_attachSize
=
value; }
}
private
bool
m_canPostAttach;
///
<sumMary>
///
是否允许上传附件
///
</sumMary>
public
bool
CanPostAttach
{
get
{
return
m_canPostAttach; }
set
{ m_canPostAttach
=
value; }
}
private
int
m_maxAttachSize;
///
<sumMary>
///
单个附件大小
///
</sumMary>
public
int
MaxAttachSize
{
get
{
return
m_maxAttachSize; }
set
{ m_maxAttachSize
=
value; }
}
private
String
m_errmessage;
///
<sumMary>
///
错误信息
///
</sumMary>
public
String
Errmessage
{
get
{
return
m_errmessage; }
set
{ m_errmessage
=
value; }
}
private
int
m_maxAttachments;
///
<sumMary>
///
最大允许上传的附件数
///
</sumMary>
public
int
Maxattachments
{
get
{
return
m_maxAttachments; }
set
{ m_maxAttachments
=
value; }
}
}
#endregion
如果一切顺利,客户端会
获取相应的UploadSe
Tinfo实例信息来进行SL
插件的信息绑定,也就是之前第二张图中所说的信息
内容(红框部分)。
大佬总结
以上是大佬教程为你收集整理的DiscuzNT使用Silverlight进行多文件上传(上)全部内容,希望文章能够帮你解决DiscuzNT使用Silverlight进行多文件上传(上)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。