上传文件至sharepoint
众所周知绝大多数OA办公软件都离不开他们的金牌合作伙伴à文件管理与上传!假如失去这位挚友,那它的功能也就大打折扣咯,更别说被企业得到友好,广泛的使用!而被大家熟悉的sharepoint也不例外哦!它的上传功能照样是Strong!本章节,笔者主要围绕文档权限,文档上传,角色分配3大模块来讲,并以FileUploadSolution进行演示和注释。
前提准备:
1.了解,熟悉sharepoint的权限架构,针对这块如果大家还不大了解的话,可以参考SDK。2.了解sharepoint的文档上传,注意点有哪些,和直接在平时做的ASP.NET做的文档上传差异点在哪(这边要清楚,MOSS上很多路径是映射到IIS上面的,所以有些上传的地方就不能依旧以前的习惯直接给他一条路径,上传的时候,文件最好以filestream 的形式读取,写入,MOSS上传文件的最大值为2G)
3.了解如何进行权限分配,以及如何提高普通用户的访问权限。带着这些疑问,或者更多的疑问一起更我这个初学者踏入UploadFile to sharepoint吧!
4.页面部署了QuikPart,以及如何用QuikPart包装用户控件(这块应该是最基本了,所以笔者也不再像刚开始那样一步步的叙述和截屏了,如有不明白前面篇章都有提到!)
首先。还是大家所熟悉的创建一个webapplication项目取名为FileUploadOnMosSolution.
1.在页面上添加一个用户控件页面命名为:FileUploadOnMoss.ascx,删除原先的default.aspx页面。在该页面上添加一个UploadFile控件,两个下拉框,一个lable
3.在项目属性生成后事件,直接写命令行以便生成项目时直接把程序集和用户控件界面拷贝到相应的目录进行部署,提高开发的效率(记得把80给成自己机子的端口):
copy "$(TargetDir)*.dll" C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin
copy "$(ProjectDir)*.ascx" C:\Inetpub\wwwroot\wss\VirtualDirectories\80\wpresources\FileUpload
源码:
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
代码:
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给笔者,或QQ:378249739{非诚勿扰}
(更新备注:之前一些错误都改正过来,也谢谢几位网友的参考)