• 在sharepoint中利用文档库扩展新闻应用


    在sharepoint中利用文档库扩展新闻应用

     

    本人刚刚开始使用Sharepoint,理解尚浅,错误之处请各位指正。
    Sharepoint的发布类模板可以建立对外的新闻类应用,但是目前在使用上还有诸多限制,不是很方便。在前一段时间给用户实施时引起了用户的很大不满。为此,特意在文档库的基础上建立了一套新闻管理系统,这套新闻系统主要有新闻发布与编辑,新闻列表、新闻浏览、分类管理等组成,主要用web part方式实现,各种参数按需传入,可以按照需要,灵活配置,下面先从与文档库结合紧密的分类管理说起;
    1、分类管理
    在顶级站点下新建一子站点,建立文档库news,其url是子站点下的DocLi/News,这是所有新闻的根目录,然后在其下建立子文件夹,每个文件夹代表一类别,文件夹可以相互嵌套,因此,理论上新闻类别支持无限分级。
    分类管理操作界面可以使用默认的文档库管理界面,也可以利用Sharepoint编程对象编写一个web part来实现,主要用到SPSite、SPWeb、SPFolder、SPFile等对象。为了使web part部署灵活,新闻站点名称等可使用参数传入,简要如下:
    使用SPContext.Current.Site获取顶级站点……
    使用主站点.AllWebs[新闻站点名称]获取新闻子站点名称……
    使用子站点.Folders及SubFolders获取各个文件夹,即新闻类别……
    使用文件夹.Files获取各个文件……
    2、新闻发布于编辑
    主要用来撰写与编辑新闻,主要使用在线编辑。在线编辑器可以使用Sharepoint自带的编辑器,也可以用其他的,这里我使用了FCKEditor,改动了一些地方,在文档最后说明。
    新闻主要有标题、作者、发布时间、最后编辑时间、点击量、内容、评论、关键字、摘要等组成,其中内容带有html格式信息。为了方便操作,将新闻存储为xml文件,该xml文件中分别保存了前述新闻的各个属性值。
    编辑完毕在内存中生成xml格式的文件后,利用SPFileCollection(Files)的Add方法将xml文件保存到相应的目录下即可,保存到的目录可以以新闻类别的方式显示在编辑器中,与具体的文件夹对应,供编辑者选择。
    再次编辑时利用SHarepoint的相关对象获取此文件,解析项目来文件即可。
    3、新闻列表
    主要用来显示某类新闻的链接信息,生成列表时一起生成打开某条新闻的链接,该链接将以参数或者其他形式被新闻内容浏览页面获取。同样该列表也以webpart的形式出现,新闻站点、要显示的新闻分类等也以参数形式传入,可灵活部署。
    4、新闻浏览
    获取点击新闻列表传递来的某一条新闻的路径等信息,然后利用相关对象找到该新闻对应的xml文件,读取并解析、显示即可。

    最后说一下FCKEditor在Sharepoint的使用:
    1、准备FCKEditor的核心文件及FCKEditor.net组件
    FCKEditor在asp.net下的使用有很多帖子说明,如不会自行搜索,不再赘述。注意为了缩小空间可以把无关的文档删除,只保留asp.net使用的即可。
    2、使用Sharepoint Designer打开要使用FCKEditor的站点,在某一目录下导入FCKEditor的核心文件,打开C:InetpubwwwrootwssVirtualDirectories80下的web.config文件,按照FCKEditor.net的需要进行配置,注意在sharepoint中和一般asp.net站点的使用可能会有所不同,主要在设置核心及其他目录的第一个“/”上,在一般站点中可能是“/fckeditor/”,而在Sharepoint中可能是“fckeditor/”。
    3、如果设置正确,在页面上添加使用了FCKEditor.net的web part,就该看到编辑器了,看一下图片编辑的浏览和上传是不是不好使?这是因为Sharepoint的特殊架构造成的,以致FCKEditor.net不能正确获取文件,为了适应Sharepoint的使用,这里做了如下修改:
    1)打开FileWorkerBase文件,添加

    protected string Web
            {
                get
                {
                    try
                    {
                        sWeb = System.Configuration.ConfigurationSettings.AppSettings["FCKeditor:Web"];
                    }
                    catch { }
                    return sWeb;
                }
            }
    并在web.config中添加FCKeditor:Web配置,用来标识是在Sharepoint中还是一般站点中使用,规则自己定。
    为了方便,还添加了如下方法:
    protected SPFolder GetFolder()
            {
                //SPWeb w = SPControl.GetContextWeb(Context);
                SPSite site = SPContext.Current.Site;
                SPWeb web = null;
                if (sWeb == ".")
                {
                    web = SPContext.Current.Web;
                }
                else
                {
                    web = site.AllWebs[sWeb];
                }
                web.AllowUnsafeUpdates = true;
                SPFolder folder = null;
                string[] folders = this.UserFilesPath.TrimEnd('/').Split('/');
                folder = web.Folders[folders[0]];
                if (folders.Length > 1)
                {
                    for (int i = 1; i < folders.Length; i++)
                    {
                        folder = folder.SubFolders[folders[i]];
                    }
                }
                return folder;
            }

    主要用来根据设置获取到存放图片的Folder对象。
    2)修改Uploader文件

    protected override void OnLoad(EventArgs e)
            {
                // Get the posted file.
                HttpPostedFile oFile = Request.Files["NewFile"] ;

                // Check if the file has been correctly uploaded
                if ( oFile == null || oFile.ContentLength == 0 )
                {
                    SendResults( 202 ) ;
                    return ;
                }

                int iErrorNumber = 0 ;
                string sFileUrl = "" ;

                // Get the uploaded file name.
                string sFileName = System.IO.Path.GetFileName( oFile.FileName ) ;

                int iCounter = 0 ;
                string sWeb = this.Web;
                if (sWeb == "" || sWeb == null)
                {
                    while (true)
                    {
                        string sFilePath = System.IO.Path.Combine(this.UserFilesDirectory, sFileName);

                        if (System.IO.File.Exists(sFilePath))
                        {
                            iCounter++;
                            sFileName =
                                System.IO.Path.GetFileNameWithoutExtension(oFile.FileName) +
                                "(" + iCounter + ")" +
                                System.IO.Path.GetExtension(oFile.FileName);

                            iErrorNumber = 201;
                        }
                        else
                        {
                            oFile.SaveAs(sFilePath);

                            sFileUrl = this.UserFilesPath + sFileName;
                            break;
                        }
                    }
                }
                else
                {
                    FileStream f=null;
                    try
                    {
                        SPFolder folder = this.GetFolder();

                        f = new FileStream(oFile.FileName, FileMode.Open);
                        byte[] content = new byte[f.Length];
                        f.Read(content, 0, (int)f.Length);
                        string fileurl=SPContext.Current.Site.Url + "/" + sWeb + "/" + folder.Url + "/" + sFileName;
                        folder.Files.Add(fileurl, content, true);
                        sFileUrl = fileurl;
                    }
                    catch (Exception ee)
                    {
                        Response.Write(ee.Message);
                    }
                    finally
                    {
                        f.Dispose();
                        
                    }
                }

                SendResults( iErrorNumber, sFileUrl, sFileName ) ;
            }

    3)打开FileBrowserConnector文件,这是图片浏览中需要的代码文件,修改相应方法:
    private void GetFolders( XmlNode connectorNode, string resourceType, string currentFolder )
            {
                string sWeb = this.Web;
                if (sWeb == "" || sWeb == null)
                {
                    // Map the virtual path to the local server path.
                    string sServerDir = this.ServerMapFolder(resourceType, currentFolder);

                    // Create the "Folders" node.
                    XmlNode oFoldersNode = XmlUtil.AppendElement(connectorNode, "Folders");

                    System.IO.DirectoryInfo oDir = new System.IO.DirectoryInfo(sServerDir);
                    System.IO.DirectoryInfo[] aSubDirs = oDir.GetDirectories();

                    for (int i = 0; i < aSubDirs.Length; i++)
                    {
                        // Create the "Folders" node.
                        XmlNode oFolderNode = XmlUtil.AppendElement(oFoldersNode, "Folder");
                        XmlUtil.SetAttribute(oFolderNode, "name", aSubDirs[i].Name);
                    }
                }
                else
                {
                    
                    SPFolder folder = this.GetFolder();
                    XmlNode oFoldersNode = XmlUtil.AppendElement(connectorNode, "Folders");
                   
                   // System.IO.DirectoryInfo oDir = new System.IO.DirectoryInfo(sServerDir);
                    //System.IO.DirectoryInfo[] aSubDirs = oDir.GetDirectories();
                    SPFolderCollection aSubDirs = folder.SubFolders;
                    for (int i = 0; i < aSubDirs.Count; i++)
                    {
                        // Create the "Folders" node.
                        XmlNode oFolderNode = XmlUtil.AppendElement(oFoldersNode, "Folder");
                        XmlUtil.SetAttribute(oFolderNode, "name", aSubDirs[i].Name);
                    }

                }
            }

            private void GetFiles( XmlNode connectorNode, string resourceType, string currentFolder )
            {
                string sWeb = this.Web;
                if (sWeb == "" || sWeb == null)
                {
                    // Map the virtual path to the local server path.
                    string sServerDir = this.ServerMapFolder(resourceType, currentFolder);

                    // Create the "Files" node.
                    XmlNode oFilesNode = XmlUtil.AppendElement(connectorNode, "Files");

                    System.IO.DirectoryInfo oDir = new System.IO.DirectoryInfo(sServerDir);
                    System.IO.FileInfo[] aFiles = oDir.GetFiles();

                    for (int i = 0; i < aFiles.Length; i++)
                    {
                        Decimal iFileSize = Math.Round((Decimal)aFiles[i].Length / 1024);
                        if (iFileSize < 1 && aFiles[i].Length != 0) iFileSize = 1;

                        // Create the "File" node.
                        XmlNode oFileNode = XmlUtil.AppendElement(oFilesNode, "File");
                        XmlUtil.SetAttribute(oFileNode, "name", aFiles[i].Name);
                        XmlUtil.SetAttribute(oFileNode, "size", iFileSize.ToString(CultureInfo.InvariantCulture));
                    }
                }
                else
                {
                    
                    SPFolder folder = this.GetFolder();
                    XmlNode oFilesNode = XmlUtil.AppendElement(connectorNode, "Files");

                    SPFileCollection aFiles = folder.Files;

                    for (int i = 0; i < aFiles.Count; i++)
                    {
                        Decimal iFileSize = Math.Round((Decimal)aFiles[i].Length / 1024);
                        if (iFileSize < 1 && aFiles[i].Length != 0) iFileSize = 1;

                        // Create the "File" node.
                        XmlNode oFileNode = XmlUtil.AppendElement(oFilesNode, "File");
                        XmlUtil.SetAttribute(oFileNode, "name", aFiles[i].Name);
                        XmlUtil.SetAttribute(oFileNode, "size", iFileSize.ToString(CultureInfo.InvariantCulture));
                    }
                }

            }

    private void FileUpload( string resourceType, string currentFolder )
            {
                HttpPostedFile oFile = Request.Files["NewFile"] ;

                string sErrorNumber = "0" ;
                string sFileName = "" ;
                //string sFileUrl = "";
                if ( oFile != null )
                {
                     string sWeb = this.Web;
                     if (sWeb == "" || sWeb == null)
                     {
                         // Map the virtual path to the local server path.
                         string sServerDir = this.ServerMapFolder(resourceType, currentFolder);

                         // Get the uploaded file name.
                         sFileName = System.IO.Path.GetFileName(oFile.FileName);

                         int iCounter = 0;

                         while (true)
                         {
                             string sFilePath = System.IO.Path.Combine(sServerDir, sFileName);

                             if (System.IO.File.Exists(sFilePath))
                             {
                                 iCounter++;
                                 sFileName =
                                     System.IO.Path.GetFileNameWithoutExtension(oFile.FileName) +
                                     "(" + iCounter + ")" +
                                     System.IO.Path.GetExtension(oFile.FileName);

                                 sErrorNumber = "201";
                             }
                             else
                             {
                                 oFile.SaveAs(sFilePath);
                                 break;
                             }
                         }
                     }
                     else
                     {
                         FileStream f = null;
                         try
                         {
                             SPFolder folder = this.GetFolder();

                             f = new FileStream(oFile.FileName, FileMode.Open);
                             byte[] content = new byte[f.Length];
                             f.Read(content, 0, (int)f.Length);
                             string fileurl = SPContext.Current.Site.Url + "/" + sWeb + "/" + folder.Url + "/" + sFileName;
                             folder.Files.Add(fileurl, content, true);
                             //sFileUrl = fileurl;
                         }
                         catch (Exception ee)
                         {
                             Response.Write(ee.Message);
                         }
                         finally
                         {
                             f.Dispose();

                         }
                     }
                }
                else
                    sErrorNumber = "202" ;

                Response.Clear() ;

                Response.Write( "<script type="text/javascript">" ) ;
                Response.Write( "window.parent.frames['frmUpload'].OnUploadCompleted(" + sErrorNumber + ",'" + sFileName.Replace( "'", "\'" ) + "') ;" ) ;
                Response.Write( "</script>" ) ;

                Response.End() ;
            }

    编译,试一下,是不是OK了?
     
     
     

    续-在sharepoint中利用文档库扩展新闻应用

     
        《在sharepoint中利用文档库扩展新闻应用》发出之后,收到许多朋友的诸多反馈,这篇随笔意在抛砖引玉,提出一种解决问题的思考方向,在实际应用中还需要根据实际情况和需求,灵活运用。
        在文章中,对于新闻内容的保存,是用的xml,这种方式的好处不再多说。然而也有很大的缺点,比如使用原有的搜索搜索之后,得到的是这个xml文件,而想要正确浏览内容的话,就必须对搜索做一些开发。还有很多其他的不便之处。
        解决这个问题的另外一种方法是使用模板,把内容直接保存到模板上。举一个简单的例子:
        首先,建一个文档库,利用文档库的文件夹及其层次表达内容的分类以及层次。
        第二,按照整个站点的风格,创建一个内容页作为模板,并在上面做好标记,如<$TITLE$>,<$CONTENT$>等,这些标记标明了文章的标题、作者、浏览量发表日期、正文内容等。
        第三,使用编辑器创建文章
        第四,保存。保存的时候,使用web.GetFileAsString得到第二步中的模板的string,然后用相应的内容替换掉标记,然后把该string转为byte[],使用folder.Files.Add添加到某个文件夹之内即可,注意保存的格式需要和模板一致,如.aspx,或者静态页面。    同时编辑文章时的标题、创建者等内容作为一个字段保存为这个文件的属性。
        看到这里,又出现的问题是,保存之后如何编辑?浏览量怎么显示?
        保存后的编辑问题。在做模板时,可以在内容开始和结束的地方加以标记,编辑的时候,首先获取该文件的string,然后查找开始和结束标记,然后截取之间的内容就是正文了,其他的标题等到字段里面取。
        浏览量的问题。这个问题的难点在于是动态变化的,每次都不一样,因而无法和正文一样固定下来。但是也有很多解决方式,在SPS中最常用的,莫过于引用控件或者web部件了,如果保存格式是aspx页面,完全可以写一个usercontrol,然后从里面获取、显示、更新浏览量,至于control的引用方式,可以把ascx文件拷贝到sps控件的那个目录CONTROLTEMPLATES下,按照sps的引用方式标记到页面里面就可以了。
        使用这种方式还需要考察性能、安全等诸方面。
        下图是我们最近项目中的页面截图:

        在这个项目中,对于新闻内容,我们使用了类似上述的方式,并集成了多个业务系统以及单点登录等。页面上每一个区域块,都用web部件方式部署。
        时间关系,先写这么多,欢迎交流。
  • 相关阅读:
    Sysenter/Kifastcallentry hook 检测与恢复
    几种Windows进程通信
    漫谈IRP
    RC4加密算法
    在线考试系统基础模块开发(RBAC)
    在线考试系统项目环境搭建
    在线考试系统考试模块完善
    在线考试系统题库管理
    在线考试系统数据统计模块
    在线考试系统在线考试模块
  • 原文地址:https://www.cnblogs.com/ningang/p/4321855.html
Copyright © 2020-2023  润新知