上传文件至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

源码:
<%@ 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

代码:
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
}73
catch74
{ //当同个目录下存在同名文件时,做出错误的提示!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;//通过文件对象获取item143
int id1 = item.ID;//获取该列表的唯一ID144
AddUserpepodom(id1);145
146
}147
else148
{149
Guid id = Guid.Empty;150
foreach (SPListItem folderItem in Mylist.Folders)151
{152
if (folderItem.Name == FolderNameDrp.SelectedValue)153
{154
id = folderItem.UniqueId;//获取匹配的文件GUID155
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对象获得item162
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 web194
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{非诚勿扰}
(更新备注:之前一些错误都改正过来,也谢谢几位网友的参考)



浙公网安备 33010602011771号