上传文档至MOSS之如何更改创建者栏位的值?
该篇章笔者简述下如何解决提升用户权限上传文档到MOSS之后,修改创建者为文档上传的本人(解决这个问题还是用到移花接木。。。)。也许老手一看标题就清楚了,该标题太忽悠人了(因为创建者字段类型为用户或用户组,作为一个只读类型是不让更改的)!但是如果做为新手对创建者栏位不了解的话看到这标题,也许觉得很新鲜,很贴切,并一直埋头苦干想进一切办法把创建者栏位的值改成上传者本人名字。到最后还是以失败告终。为了避免误导,还是以详细截图来说明解决问题的办法来引导新手更好的完成这个烦恼。
首先,用一个只有只读权限的【test03】用户登陆MOSS上传文档(至于如何解决文档上传,新手可参考我前面的文章上传文档至MOSS),可以看到只读权限的用户也拥有了对他自己所上传文档进行编辑,删除的权利。但是创建者就总是为系统管理员(这是因为进行了权限提升之后的结果。。。下面笔者就开始讲解如何干掉这个问题!!!)
用管理员登录(或者拥有可编辑权限的用户登录都OK),打开所在列表,点击【设置】->【文档库设置】
选择【创建栏】
由于系统默认的【创建者】栏位已存在,不允许重复,这里就取名为【作者】,类型选为【单行文本】,要求此栏包含信息选【是】。(记住类型不能再选【用户或用户组】,因为上面也提到了,该类型是只读域,不让赋值。)
点击确定,点击试图【所有文档】,不选中创建者栏位。(依照图例操作)
项目源码:
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
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
14 namespace 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 catch
73 { //当同个目录下存在同名文件时,做出错误的提示!
74 UploadStatusLabel.Text = "上传失败!该文件名已存在!";
75
76 }
77 }
78 else
79 {
80 UploadStatusLabel.Text = "抱歉!系统不支持你所上传的文档类型";
81 }
82
83
84 }
85 //绑定当前站点所有列表的标题
86 public void BindListTitle()
87 {
88 SPWeb web = SPContext.Current.Web;
89 string text = "====请选择====";
90 string value = string.Empty;
91 ListTitleNameDrp.Items.Add(new ListItem(text, value));
92 foreach (SPList MyList in web.Lists)
93 { //取得网站中所有列表的标题,绑定到列表下拉框
94
95 ListTitleNameDrp.Items.Add(MyList.Title);
96 }
97
98 }
99 //绑定指定列表下的文件名
100 protected void ListTitleNameDrp_SelectedIndexChanged(object sender, EventArgs e)
101 {
102 string ListTitle = ListTitleNameDrp.SelectedValue;
103 SPList Mylist=SPContext.Current.Web.Lists[ListTitle];
104 string text ="====请选择====";
105 string value = string.Empty;
106 FolderNameDrp.Items.Add(new ListItem(text, value));
107 foreach (SPListItem FolderItem in Mylist.Folders)
108 {
109 if (FolderItem.Name != "Forms")//排除为Forms的文件夹
110 {
111
112 FolderNameDrp.Items.Add(FolderItem.Name);
113 }
114 }
115 }
116
117 //文件上传
118 public void FileUpload( string fileurl,string filename)
119 {
120 SPSecurity.RunWithElevatedPrivileges(delegate()//模仿管理员的权限进行操作(代码访问权限提升)
121 {
122 using(SPSite site=new SPSite(SPContext.Current.Site.ID))//实例化SPWeb对象才能保证执行者是管理员
123 {
124 site.AllowUnsafeUpdates = true;
125 using (SPWeb web =site.AllWebs[SPContext.Current.Web.ID])
126 {
127 web.AllowUnsafeUpdates = true;
128
129 if (!File.Exists(fileurl))//判断文件是否已加载
130 {
131 throw new ArgumentException(String.Format("{0} does not exist", fileurl), "fileurl");
132 }
133 SPList Mylist = web.Lists[ListTitleNameDrp.SelectedValue];
134 FileStream fstream = File.OpenRead(fileurl);//以文件流的形式读取文件源
135 byte[] contens = new byte[fstream.Length];//定义一个直接数组
136 fstream.Read(contens, 0, (int)fstream.Length);//把文件源写入到数组容器
137 fstream.Close();//关闭文件流
138 if (FolderNameDrp.SelectedValue == "")
139 { //当用户不选指定文件时,默认存放在根目录
140 SPFile file = Mylist.RootFolder.Files.Add(filename, contens);
141 SPListItem item = file.Item;//通过文件对象获取item
142 int id1 = item.ID;//获取该列表的唯一ID
143 UpdateItem(id1);
144
145 }
146 else
147 {
148 Guid id = Guid.Empty;
149 foreach (SPListItem folderItem in Mylist.Folders)
150 {
151 if (folderItem.Name == FolderNameDrp.SelectedValue)
152 {
153 id = folderItem.UniqueId;//获取匹配的文件GUID
154 break;
155 }
156 }
157
158 SPFolder folder = web.GetFolder(id);//通过GUID 获取文件夹
159 SPFile file = folder.Files.Add(filename, contens);//把文件加载到指定的文件夹目录
160 SPListItem item = file.Item;//通过file对象获得item
161 int id2 = item.ID;//获取每个列表项的唯一ID
162 UpdateItem(id2);
163 }
164 }
165 }
166 });
167 }
168
169 //重新分配角色(这一部的目的就是提升低权限用户的权限,使他能够拥有编辑自己所上传那个文档的权限。)
170 public void UpdateItem(int id)
171 {
172 //通过唯一ID获取当前站点集
173 using (SPSite site = new SPSite(SPContext.Current.Site.ID))
174 {
175 //通过唯一ID获取当前站点
176 using (SPWeb web = site.AllWebs[SPContext.Current.Web.ID])
177 {
178 //获得用户选定的列表
179 SPList list = web.Lists[ListTitleNameDrp.SelectedValue];
180 //通过列表项ID获取可以确保该列表项唯一性
181 SPListItem item = list.Items.GetItemById(id);
182 //不继承父类权限
183 item.BreakRoleInheritance(true);
184 //清除该列表条目原有的所有角色权限
185 foreach (SPRoleAssignment roleassignments in item.RoleAssignments)
186 {
187 //表示允许更新site and web
188 site.AllowUnsafeUpdates = true;
189 web.AllowUnsafeUpdates = true;
190 roleassignments.RoleDefinitionBindings.RemoveAll();
191 //记得重新更新下列表条目
192 item.Update();
193
194 }
195 //获取该站点当前登录的用户(这步的目的就是为了让只有只读权限的用户也拥有对他所上传的文档进行编辑的权限。
196 //<在实际企业应用还时很实用的,例如一个企业,一些权限低的员工上传文档,如果没进行权限提升,那他就没权限修改自己所上传的文档,只有查看咯>)
197 string UserLoginName=SPContext.Current.Web.CurrentUser.LoginName;
198 SPUser authorUser = web.AllUsers[UserLoginName];
199 //对用户进行角色分配
200 SPRoleAssignment roleassignment = new SPRoleAssignment(authorUser.LoginName, authorUser.Email, authorUser.Name, authorUser.Notes);
201 //重新进行角色定义.
202 roleassignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.WebDesigner));
203 item.RoleAssignments.Add(roleassignment);
204 //把当前的登录用户名赋值给作者字段,然后更新
205 item["作者"] = SPContext.Current.Web.CurrentUser.Name;
206 item.Update();
207 }
208 }
209 }
210 }
211}
212
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
14 namespace 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 catch
73 { //当同个目录下存在同名文件时,做出错误的提示!
74 UploadStatusLabel.Text = "上传失败!该文件名已存在!";
75
76 }
77 }
78 else
79 {
80 UploadStatusLabel.Text = "抱歉!系统不支持你所上传的文档类型";
81 }
82
83
84 }
85 //绑定当前站点所有列表的标题
86 public void BindListTitle()
87 {
88 SPWeb web = SPContext.Current.Web;
89 string text = "====请选择====";
90 string value = string.Empty;
91 ListTitleNameDrp.Items.Add(new ListItem(text, value));
92 foreach (SPList MyList in web.Lists)
93 { //取得网站中所有列表的标题,绑定到列表下拉框
94
95 ListTitleNameDrp.Items.Add(MyList.Title);
96 }
97
98 }
99 //绑定指定列表下的文件名
100 protected void ListTitleNameDrp_SelectedIndexChanged(object sender, EventArgs e)
101 {
102 string ListTitle = ListTitleNameDrp.SelectedValue;
103 SPList Mylist=SPContext.Current.Web.Lists[ListTitle];
104 string text ="====请选择====";
105 string value = string.Empty;
106 FolderNameDrp.Items.Add(new ListItem(text, value));
107 foreach (SPListItem FolderItem in Mylist.Folders)
108 {
109 if (FolderItem.Name != "Forms")//排除为Forms的文件夹
110 {
111
112 FolderNameDrp.Items.Add(FolderItem.Name);
113 }
114 }
115 }
116
117 //文件上传
118 public void FileUpload( string fileurl,string filename)
119 {
120 SPSecurity.RunWithElevatedPrivileges(delegate()//模仿管理员的权限进行操作(代码访问权限提升)
121 {
122 using(SPSite site=new SPSite(SPContext.Current.Site.ID))//实例化SPWeb对象才能保证执行者是管理员
123 {
124 site.AllowUnsafeUpdates = true;
125 using (SPWeb web =site.AllWebs[SPContext.Current.Web.ID])
126 {
127 web.AllowUnsafeUpdates = true;
128
129 if (!File.Exists(fileurl))//判断文件是否已加载
130 {
131 throw new ArgumentException(String.Format("{0} does not exist", fileurl), "fileurl");
132 }
133 SPList Mylist = web.Lists[ListTitleNameDrp.SelectedValue];
134 FileStream fstream = File.OpenRead(fileurl);//以文件流的形式读取文件源
135 byte[] contens = new byte[fstream.Length];//定义一个直接数组
136 fstream.Read(contens, 0, (int)fstream.Length);//把文件源写入到数组容器
137 fstream.Close();//关闭文件流
138 if (FolderNameDrp.SelectedValue == "")
139 { //当用户不选指定文件时,默认存放在根目录
140 SPFile file = Mylist.RootFolder.Files.Add(filename, contens);
141 SPListItem item = file.Item;//通过文件对象获取item
142 int id1 = item.ID;//获取该列表的唯一ID
143 UpdateItem(id1);
144
145 }
146 else
147 {
148 Guid id = Guid.Empty;
149 foreach (SPListItem folderItem in Mylist.Folders)
150 {
151 if (folderItem.Name == FolderNameDrp.SelectedValue)
152 {
153 id = folderItem.UniqueId;//获取匹配的文件GUID
154 break;
155 }
156 }
157
158 SPFolder folder = web.GetFolder(id);//通过GUID 获取文件夹
159 SPFile file = folder.Files.Add(filename, contens);//把文件加载到指定的文件夹目录
160 SPListItem item = file.Item;//通过file对象获得item
161 int id2 = item.ID;//获取每个列表项的唯一ID
162 UpdateItem(id2);
163 }
164 }
165 }
166 });
167 }
168
169 //重新分配角色(这一部的目的就是提升低权限用户的权限,使他能够拥有编辑自己所上传那个文档的权限。)
170 public void UpdateItem(int id)
171 {
172 //通过唯一ID获取当前站点集
173 using (SPSite site = new SPSite(SPContext.Current.Site.ID))
174 {
175 //通过唯一ID获取当前站点
176 using (SPWeb web = site.AllWebs[SPContext.Current.Web.ID])
177 {
178 //获得用户选定的列表
179 SPList list = web.Lists[ListTitleNameDrp.SelectedValue];
180 //通过列表项ID获取可以确保该列表项唯一性
181 SPListItem item = list.Items.GetItemById(id);
182 //不继承父类权限
183 item.BreakRoleInheritance(true);
184 //清除该列表条目原有的所有角色权限
185 foreach (SPRoleAssignment roleassignments in item.RoleAssignments)
186 {
187 //表示允许更新site and web
188 site.AllowUnsafeUpdates = true;
189 web.AllowUnsafeUpdates = true;
190 roleassignments.RoleDefinitionBindings.RemoveAll();
191 //记得重新更新下列表条目
192 item.Update();
193
194 }
195 //获取该站点当前登录的用户(这步的目的就是为了让只有只读权限的用户也拥有对他所上传的文档进行编辑的权限。
196 //<在实际企业应用还时很实用的,例如一个企业,一些权限低的员工上传文档,如果没进行权限提升,那他就没权限修改自己所上传的文档,只有查看咯>)
197 string UserLoginName=SPContext.Current.Web.CurrentUser.LoginName;
198 SPUser authorUser = web.AllUsers[UserLoginName];
199 //对用户进行角色分配
200 SPRoleAssignment roleassignment = new SPRoleAssignment(authorUser.LoginName, authorUser.Email, authorUser.Name, authorUser.Notes);
201 //重新进行角色定义.
202 roleassignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.WebDesigner));
203 item.RoleAssignments.Add(roleassignment);
204 //把当前的登录用户名赋值给作者字段,然后更新
205 item["作者"] = SPContext.Current.Web.CurrentUser.Name;
206 item.Update();
207 }
208 }
209 }
210 }
211}
212
最后,重新生成项目,用【test03】用户登录,上载文档,就可得到想要的结果了。(虽然是土办法,但是能解决问题还是好办法,希望能给新手一个好的引导。。。。。)