我目前正面临使用功能中使用的提升模式的问题。
我创建了一个自定义SharePoint安全角色(没有删除权限的贡献角色)。 我的SharePoint功能的目标如下:
将文件上传到SP站点时,需要使用选择的元数据重命名文件名。上传文件时,第二种形式是要求用户定义3或4个元数据。
要重命名该文件,我开发了以下代码:
Public override void ItemAdded(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
CallFunctionToUpdate();
});
}
Public override void ItemUpdated(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
CallFunctionToUpdate();
});
}
Public void CallFunctionToUpdate()
{
try
{
this.EventFiringEnabled = false;
using (SPWeb newWeb = newSite.OpenWeb(_properties.RelativeWebUrl))
{
SPListItem item = newWeb.Lists[_properties.ListId].GetItemById(_properties.ListItem.ID);
newFileName = FilenameManagementHelper.GenerateFilename(properties.ListItem);
currentName = properties.ListItem["Name"].ToString();
var extension = Path.GetExtension(currentName);
if (item["Title"] == null || item["Title"].ToString() != newFileName)
{
item["Title"] = newFileName;
item["Editor"] = new SPFieldUserValue(properties.OpenWeb(), properties.OpenWeb().CurrentUser.ID, properties.OpenWeb().CurrentUser.LoginName);
item.SystemUpdate();
}
if (currentName.Substring(0, currentName.Length - extension.Length) != newFileName)
{
SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
folder.Files.Add(destUrl, bin, fileToMove.Properties, true);
fileToMove.Delete(); newWeb.Lists[list.RootFolder.Url].Update();
}
}
}
catch (Exception ex)
{
DocumentDiagnosticService.LogError(CategoryID.Error, string.Format("Error {0} for the file name - {1}", ex.Message, currentName));
}
finally
{
this.EventFiringEnabled = true;
}
}
在重命名文件名之前,我更新了字段(元数据' s)标题和编辑器。第二步将移动文件(包含元数据&与上传文件关联的历史记录)
我使用提升模式,因为具有受限安全角色的用户无法删除。在开发的代码中,我移动了重命名的文件并删除了上传的旧文件。
我找到了这种方法,因为我需要保持版本控制。不允许直接更新文件的名称(例如标题)并且丢失了历史记录。例如:将上传文件,将使用元数据更新文件的名称。对于第一个版本,没有问题。上传具有相同元数据的第二个文件,因为已存在具有相同名称的现有文件,这将生成错误。使用Files.Add,它将运行当前文件并保留历史记录。
我在这种情况下的问题:当用户上传文件时,标题和编辑器字段被正确替换。比移动文件,重命名字段名称和删除旧版本。此时,“修改方式”字段始终是SharePoint Sys Admin。
如何使用上传文件的人的姓名保留Modifiy?
编辑:
使用以下代码:
SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
folder.Files.Add(destUrl, bin, fileToMove.Properties, true);
fileToMove.Delete();
允许我移动文件,并在上传过程中选择元数据。如果已经上传了当前版本,我仍然有版本控制但是修改者是SysAdmin。
使用以下代码:
SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
SPUser author = fileToMove.Author;
folder.Files.Add(destUrl, bin, author, author, DateTime.Now, DateTime.Now);
fileToMove.Delete();
如果我已有版本,请允许我移动文件并保留历史记录。我现在可以获得由正在上传的真实用户填充的“修改者”字段,而不是SysAdmin,但我在上传期间丢失了选择的元数据。
感谢您的支持,
修正。
答案 0 :(得分:0)
使用item.Update()
代替SystemUpdate()
。它应该保留登录用户的身份。
答案 1 :(得分:0)
感谢您的支持。 我已使用以下代码解决了我的问题:
folder.Files.Add(destUrl, bin, fileToMove.Properties, author, author, DateTime.Now, DateTime.Now, true);
现在,我已经使用正在上传的用户填充了Modified By值,元数据仍然存在并且版本也是。