上传文件至sharepoint

 众所周知绝大多数OA办公软件都离不开他们的金牌合作伙伴à文件管理与上传!假如失去这位挚友,那它的功能也就大打折扣咯,更别说被企业得到友好,广泛的使用!而被大家熟悉的sharepoint也不例外哦!它的上传功能照样是Strong!本章节,笔者主要围绕文档权限,文档上传,角色分配3大模块来讲,并以FileUploadSolution进行演示和注释。

前提准备:

1.了解,熟悉sharepoint的权限架构,针对这块如果大家还不大了解的话,可以参考SDK2.了解sharepoint的文档上传,注意点有哪些,和直接在平时做的ASP.NET做的文档上传差异点在哪(这边要清楚,MOSS上很多路径是映射到IIS上面的,所以有些上传的地方就不能依旧以前的习惯直接给他一条路径,上传的时候,文件最好以filestream 的形式读取,写入,MOSS上传文件的最大值为2G

3.了解如何进行权限分配,以及如何提高普通用户的访问权限。带着这些疑问,或者更多的疑问一起更我这个初学者踏入UploadFile to sharepoint吧!

4.页面部署了QuikPart,以及如何用QuikPart包装用户控件(这块应该是最基本了,所以笔者也不再像刚开始那样一步步的叙述和截屏了,如有不明白前面篇章都有提到!)

 

首先。还是大家所熟悉的创建一个webapplication项目取名为FileUploadOnMosSolution.

1.在页面上添加一个用户控件页面命名为:FileUploadOnMoss.ascx,删除原先default.aspx页面。在该页面上添加一个UploadFile控件,两个下拉框,一个lable

 2.记得添加sharepoint.dll程序集。

3.在项目属性生成后事件,直接写命令行以便生成项目时直接把程序集和用户控件界面拷贝到相应的目录进行部署,提高开发的效率(记得把80给成自己机子的端口):

copy "$(TargetDir)*.dll" C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin
copy "$(ProjectDir)*.ascx" C:\Inetpub\wwwroot\wss\VirtualDirectories\80\wpresources\FileUpload

 项目源码:(笔者在这提醒:当你开发用户控件时,一定记得去源码页,点击文件->高级保存选项->编码模式:UTF-8,避免生成的webpart产生乱码)

  源码:

 

 1<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FileUploadOnMoss.ascx.cs" Inherits="FileUploadSolution.FileUploadOnMoss" %>
 2<table cellpadding="0" cellspacing="0" style=" border:1px solid; width:250px">
 3    <tr>
 4        <td style="width:137px; height: 22px;">
 5            请选择列表:</td>
 6        <td style="border-left:1px solid; height: 22px;">
 7            <asp:DropDownList ID="ListTitleNameDrp" runat="server" OnSelectedIndexChanged="ListTitleNameDrp_SelectedIndexChanged"
 8                AutoPostBack="True" Width="105px">
 9            </asp:DropDownList></td>
10    </tr>
11    <tr>
12        <td style="width:137px;border-top:1px solid;">
13            请选择文件夹:</td>
14        <td style="border-top:1px solid; border-left:1px solid">
15            <asp:DropDownList ID="FolderNameDrp" runat="server" AutoPostBack="True" Width="104px">
16            </asp:DropDownList></td>
17    </tr>
18    <tr style="border-top:1px solid;">
19        <td colspan="2" style="height: 24px;">
20            <asp:FileUpload ID="FileUpload1" runat="server" Width="240px" /></td>
21    </tr>
22   <tr style="border-top:1px solid;">
23       <td colspan="2">
24            <asp:Button ID="UploadButton" runat="server" OnClick="UploadButton_Click" Text="Upload file" /><asp:Label ID="UploadStatusLabel" runat="server" ForeColor="Red"></asp:Label>
25       </td>
26    </tr>
27</table>
28<hr />
29

代码:

 

 

 

  1using System;
  2using System.Data;
  3using System.Configuration;
  4using System.Collections;
  5using System.Web;
  6using System.Web.Security;
  7using System.Web.UI;
  8using System.Web.UI.WebControls;
  9using System.Web.UI.WebControls.WebParts;
 10using System.Web.UI.HtmlControls;
 11using Microsoft.SharePoint;
 12using System.IO;
 13
 14namespace FileUploadSolution
 15{
 16    public partial class FileUploadOnMoss : System.Web.UI.UserControl
 17    {
 18        protected void Page_Load(object sender, EventArgs e)
 19        {
 20            if(!IsPostBack)
 21              {
 22                BindListTitle();
 23             }

 24        }

 25        //上传按钮事件
 26        protected void UploadButton_Click(object sender, EventArgs e)
 27        {
 28            Boolean fileOK = false;
 29            string fileurl = FileUpload1.PostedFile.FileName;
 30            string filename=FileUpload1.FileName;
 31            SPWeb web = SPContext.Current.Web;
 32            string pathToCheckUrl = string.Empty;
 33            string pathToCheck = string.Empty;
 34            if (FolderNameDrp.SelectedValue!="")
 35            {
 36                pathToCheckUrl= web.Lists[ListTitleNameDrp.SelectedValue].RootFolder.SubFolders[FolderNameDrp.SelectedValue].Url;
 37            }

 38            else
 39            {
 40                pathToCheckUrl = web.Lists[ListTitleNameDrp.SelectedValue].RootFolder.Url;
 41            }

 42            pathToCheck = pathToCheckUrl +'/'+ filename;//获取文件所在的路径
 43           
 44            if (FileUpload1.HasFile)//判断上传文件是否加载了文件源
 45            {
 46                String fileExtension =System.IO.Path.GetExtension(filename).ToLower();
 47                //获取文件后缀名名与自行规定的文件类型进行匹配
 48                String[] allowedExtensions = 
 49                ".doc"".docx"".pptx"".xlsx"".ppt" };
 50                for (int i = 0; i < allowedExtensions.Length; i++)
 51                {
 52                    if (fileExtension == allowedExtensions[i])
 53                    {
 54                        fileOK = true;
 55                    }

 56                }

 57            }

 58            if (fileOK)
 59            {
 60                try
 61                {
 62                    if (System.IO.File.Exists(pathToCheck))//检索同目录下是否已存在了相同的文件名
 63                    {
 64                        //throw new ArgumentException(String.Format("{0} 该文件名已经存在!", filename), "filename");
 65                    }

 66                    else
 67                    {
 68                        FileUpload(fileurl, filename);
 69                        UploadStatusLabel.Text = "上传成功!";
 70                                            
 71                    }

 72                }

 73                catch
 74                {    //当同个目录下存在同名文件时,做出错误的提示!
 75                    UploadStatusLabel.Text = "上传失败!该文件名已存在!";
 76                
 77                }

 78            }

 79            else 
 80            {
 81                UploadStatusLabel.Text = "抱歉!系统不支持你所上传的文档类型";
 82            }

 83
 84            
 85        }

 86        //绑定当前站点所有列表的标题
 87        public void BindListTitle()
 88        {
 89            SPWeb web = SPContext.Current.Web;
 90            string text = "====请选择====";
 91            string value = string.Empty;
 92            ListTitleNameDrp.Items.Add(new ListItem(text, value));
 93            foreach (SPList MyList in web.Lists)
 94              {  //取得网站中所有列表的标题,绑定到列表下拉框
 95                   
 96                   ListTitleNameDrp.Items.Add(MyList.Title);    
 97              }

 98                    
 99        }

100        //绑定指定列表下的文件名
101       protected void ListTitleNameDrp_SelectedIndexChanged(object sender, EventArgs e)
102        {
103            string ListTitle = ListTitleNameDrp.SelectedValue;
104            SPList Mylist=SPContext.Current.Web.Lists[ListTitle];
105            string text ="====请选择====";
106            string value = string.Empty;
107            FolderNameDrp.Items.Add(new ListItem(text, value));
108            foreach (SPListItem FolderItem in Mylist.Folders)
109            {
110                if (FolderItem.Name != "Forms")//排除为Forms的文件夹
111                {
112                      
113                    FolderNameDrp.Items.Add(FolderItem.Name);
114                }

115            }

116        }

117    
118        //文件上传 
119        public void FileUpload( string fileurl,string filename)
120        {
121            SPSecurity.RunWithElevatedPrivileges(delegate()//模仿管理员的权限进行操作(代码访问权限提升)
122            
123               using(SPSite site=new SPSite(SPContext.Current.Site.ID))//实例化SPWeb对象才能保证执行者是管理员
124               {
125                    site.AllowUnsafeUpdates = true;
126                    using (SPWeb web =site.AllWebs[SPContext.Current.Web.ID])
127                   {
128                       web.AllowUnsafeUpdates = true;
129
130                       if (!File.Exists(fileurl))//判断文件是否已加载
131                       {
132                           throw new ArgumentException(String.Format("{0} does not exist", fileurl), "fileurl");
133                       }

134                       SPList Mylist = web.Lists[ListTitleNameDrp.SelectedValue];
135                       FileStream fstream = File.OpenRead(fileurl);//以文件流的形式读取文件源
136                       byte[] contens = new byte[fstream.Length];//定义一个直接数组
137                       fstream.Read(contens, 0, (int)fstream.Length);//把文件源写入到数组容器
138                       fstream.Close();//关闭文件流
139                       if (FolderNameDrp.SelectedValue == "")
140                       {    //当用户不选指定文件时,默认存放在根目录
141                           SPFile file = Mylist.RootFolder.Files.Add(filename, contens);
142                           SPListItem item = file.Item;//通过文件对象获取item
143                           int id1 = item.ID;//获取该列表的唯一ID
144                           AddUserpepodom(id1);
145                           
146                       }

147                       else
148                       {
149                           Guid id = Guid.Empty;
150                           foreach (SPListItem folderItem in Mylist.Folders)
151                           {
152                               if (folderItem.Name == FolderNameDrp.SelectedValue)
153                               {
154                                   id = folderItem.UniqueId;//获取匹配的文件GUID
155                                   break;
156                               }

157                           }

158
159                           SPFolder folder = web.GetFolder(id);//通过GUID 获取文件夹
160                           SPFile file = folder.Files.Add(filename, contens);//把文件加载到指定的文件夹目录
161                           SPListItem item = file.Item;//通过file对象获得item
162                           int id2 = item.ID;//获取每个列表项的唯一ID 
163                           AddUserpepodom(id2);
164                         
165                       }

166                   }

167               }

168           }
);
169        }

170
171        //重新分配文档权限(以下代码段可以实现具体某个用户对某一个文档所拥有的权限)
172        public void AddUserpepodom(int id)
173        
174            //提升用户访问权限(模拟管理员权限)
175           
176           SPSecurity.RunWithElevatedPrivileges(delegate()   
177               {
178                 //通过唯一ID获取当前站点集
179                using (SPSite site = new SPSite(SPContext.Current.Site.ID))    
180                {
181                    //通过唯一ID获取当前站点
182                    using (SPWeb web = site.AllWebs[SPContext.Current.Web.ID]) 
183                    {
184                        //获得用户选定的列表
185                        SPList list = web.Lists[ListTitleNameDrp.SelectedValue];    
186                        //通过列表项ID获取可以确保该列表项唯一性
187                        SPListItem item = list.Items.GetItemById(id);
188                        //不继承父类权限
189                        item.BreakRoleInheritance(true);
190                        //清除该列表条目原有的所有角色权限
191                        foreach (SPRoleAssignment roleassignments in item.RoleAssignments)
192                        {
193                            //表示允许更新site and web
194                            site.AllowUnsafeUpdates = true;
195                            web.AllowUnsafeUpdates = true;
196                            roleassignments.RoleDefinitionBindings.RemoveAll();
197                            //记得重新更新下列表条目
198                            item.Update();
199
200                        }

201                        //获取该站点当前登录的用户(这步的目的就是为了让只有只读权限的用户也拥有对他所上传的文档进行编辑的权限。
202                        //<在实际企业应用还时很实用的,例如一个企业,一些权限低的员工上传文档,如果没进行权限提升,那他就没权限修改自己所上传的文档,只有查看咯>)
203                        string UserLoginName=SPContext.Current.Web.CurrentUser.LoginName;
204                        //SPUser authorUser = web.AllUsers["mosing\\yongfengisvan"];
205                        SPUser authorUser = web.AllUsers[UserLoginName];
206                        //对用户进行角色分配
207                        SPRoleAssignment roleassignment = new SPRoleAssignment(authorUser.LoginName, authorUser.Email, authorUser.Name, authorUser.Notes);
208                        //重新进行角色定义.
209                        roleassignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.Administrator));
210                        item.RoleAssignments.Add(roleassignment);
211                        item.Update();
212                  
213                    }

214                }

215         }
);
216         
217     }

218        
219   }

220}

221
222
223  
224
225
226
227
228    

 Step2;

进入页面添加QuikPart,加载FileUploadOnMOSS webpart(至于如何用QuikPart开发webpart相信大家都很熟,我这里就没像一开始章节详细的概述了)

首先:笔者选择微软产品文档,该列表下Form之外(之前绑定文件夹下拉框的时候笔者已将其排除(Forms文件下都是一些web页面的文件夹名称都显示出来!

选择硬件中心,加载一个空白Elsx文档,上传(笔者进行了调试。大家注意在VS2005进行调试,需先附加到进程w3wp最后设置下断点VS2008就可以直接调试不用这么麻烦)

 

 

调试成功, 返回页面刷新

 OK!看完之后也是不是跟笔者一样有点心动了呢?(这里我便于直观的观看效果,就不把上传这模块单独起个页面。放置一起页面杂乱,PAI SEI)赶快也动手实践吧!

代码上笔者做了注释,如有疑问,后者有更好的见解也可以提下(没怎么优化代码,大家实际用的时候,就别这么马虎!),可以发email给笔者,或QQ378249739{非诚勿扰}

 

(更新备注:之前一些错误都改正过来,也谢谢几位网友的参考) 

posted @ 2009-04-11 01:17  萍水相逢  阅读(2866)  评论(10编辑  收藏  举报