silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了DiscuzNT使用Silverlight进行多文件上传(上)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

         注:本文的HTM页面均位于Discuz.Web项目中,大家可以到官方下面最终的程序。          在去年我曾写过一篇文章:“ 推荐一个Silverlight多文件(大文件)上传的开源项目”。之后有不少朋友询问这个项目示例在开发和配置上的一些问题。当时因为时间有限没有做过多的说明,导致有些问题在大家下载完源码之后运行时才出现。今天就以这个项目为原型,简要介绍一下在Discuz
         注:本文的HTM页面均位于Discuz.Web项目中,大家可以到官方下面最终的程序。
         在去年我曾写过一篇文章:“ 推荐一个Silverlight多文件(大文件)上传的开源项目”。之后有不少朋友询问这个项目示例在开发和配置上的一些问题。当时因为时间有限没有做过多的说明,导致有些问题在大家下载完源码之后运行时才出现。今天就以这个项目为原型,简要介绍一下在DiscuzNT上是如果在该项目基本上,通过完善权限管理,文件大小控制,添加@L_450_5@效果功能来大体阐述一下如果开发一个真正的silverlight应用,而不是一个简单的DEMO.
      当然本文中所列出的源码是通过reflector获取添加相应注释的。最终的源码还是要以开放出来的为准,呵呵:)

      好了,开始今天的正文吧!
   
      首先,看一下这个插件在DiscuzNT中的实际运行效果:    
    

DiscuzNT使用Silverlight进行多文件上传(上)

    
    
    

DiscuzNT使用Silverlight进行多文件上传(上)

    

DiscuzNT使用Silverlight进行多文件上传(上)

    
 

DiscuzNT使用Silverlight进行多文件上传(上)

     
     
       当我们在网页中点击“批量上传”按钮时,会运行如下JS脚本(文件位于Discuz.Web\templates\default_postattachments.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.xaml.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)后,会调用Utils.GetCredentialInfo()来获取 用户登陆信息:
///   <sumMary>
///  获取认证信息
///   </sumMary>
///   <returns></returns>
public   static  CredentialInfo GetCredentialInfo()
{
        CredentialInfo _creinfo 
=   new  CredentialInfo();
        _creinfo.UserID 
=  Utils.StrToInt(Utils.GetCookie( " userid " ),  0 );
        _creinfo.passwor
=  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 );
}

 
      其主要是通过用户本地的Cookie,来获取相应的用户信息。
   
      如果用户的Cookie有效(已登陆过),则直接获取用户所在用户组及其它相关联的权限信息, 如果无效,则提示用户登陆,同时将SL中的几个上传按钮“置灰”,以免未登陆的用户上传附件
  
      下面就是其向服务器请求谁信息的代码
 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方法来进行用户身份验证:
   
/// <sumMary>
/// 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.passwor && // 检测用户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时,则将对用户所在版块的权限信息进行获取并返一个名为UploadSeTinfo类实例,其包括
    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

        如果一切顺利,客户端会获取相应的UploadSeTinfo实例信息来进行SL插件的信息绑定,也就是之前第二张图中所说的信息内容(红框部分)。
@H_944_2488@

大佬总结

以上是大佬教程为你收集整理的DiscuzNT使用Silverlight进行多文件上传(上)全部内容,希望文章能够帮你解决DiscuzNT使用Silverlight进行多文件上传(上)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。