上传文档至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
<%@ 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

1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Collections;
5
using System.Web;
6
using System.Web.Security;
7
using System.Web.UI;
8
using System.Web.UI.WebControls;
9
using System.Web.UI.WebControls.WebParts;
10
using System.Web.UI.HtmlControls;
11
using Microsoft.SharePoint;
12
using 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
using System;2
using System.Data;3
using System.Configuration;4
using System.Collections;5
using System.Web;6
using System.Web.Security;7
using System.Web.UI;8
using System.Web.UI.WebControls;9
using System.Web.UI.WebControls.WebParts;10
using System.Web.UI.HtmlControls;11
using Microsoft.SharePoint;12
using System.IO;13
14
namespace FileUploadSolution15
{16
public partial class FileUploadOnMoss : System.Web.UI.UserControl17
{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
else39
{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
try61
{62
if (System.IO.File.Exists(pathToCheck))//检索同目录下是否已存在了相同的文件名63
{64
//throw new ArgumentException(String.Format("{0} 该文件名已经存在!", filename), "filename");65
}66
else67
{68
FileUpload(fileurl, filename);69
UploadStatusLabel.Text = "上传成功!";70
}71
}72
catch73
{ //当同个目录下存在同名文件时,做出错误的提示!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;//通过文件对象获取item142
int id1 = item.ID;//获取该列表的唯一ID143
UpdateItem(id1); 144
145
}146
else147
{148
Guid id = Guid.Empty;149
foreach (SPListItem folderItem in Mylist.Folders)150
{151
if (folderItem.Name == FolderNameDrp.SelectedValue)152
{153
id = folderItem.UniqueId;//获取匹配的文件GUID154
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对象获得item161
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 web188
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】用户登录,上载文档,就可得到想要的结果了。(虽然是土办法,但是能解决问题还是好办法,希望能给新手一个好的引导。。。。。)



浙公网安备 33010602011771号