上传文件至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" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FileUploadOnMoss.ascx.cs" Inherits="FileUploadSolution.FileUploadOnMoss" %>2
 <table cellpadding="0" cellspacing="0" style=" border:1px solid; width:250px">
<table cellpadding="0" cellspacing="0" style=" border:1px solid; width:250px">3
 <tr>
    <tr>4
 <td style="width:137px; height: 22px;">
        <td style="width:137px; height: 22px;">5
 请选择列表:</td>
            请选择列表:</td>6
 <td style="border-left:1px solid; height: 22px;">
        <td style="border-left:1px solid; height: 22px;">7
 <asp:DropDownList ID="ListTitleNameDrp" runat="server" OnSelectedIndexChanged="ListTitleNameDrp_SelectedIndexChanged"
            <asp:DropDownList ID="ListTitleNameDrp" runat="server" OnSelectedIndexChanged="ListTitleNameDrp_SelectedIndexChanged"8
 AutoPostBack="True" Width="105px">
                AutoPostBack="True" Width="105px">9
 </asp:DropDownList></td>
            </asp:DropDownList></td>10
 </tr>
    </tr>11
 <tr>
    <tr>12
 <td style="width:137px;border-top:1px solid;">
        <td style="width:137px;border-top:1px solid;">13
 请选择文件夹:</td>
            请选择文件夹:</td>14
 <td style="border-top:1px solid; border-left:1px solid">
        <td style="border-top:1px solid; border-left:1px solid">15
 <asp:DropDownList ID="FolderNameDrp" runat="server" AutoPostBack="True" Width="104px">
            <asp:DropDownList ID="FolderNameDrp" runat="server" AutoPostBack="True" Width="104px">16
 </asp:DropDownList></td>
            </asp:DropDownList></td>17
 </tr>
    </tr>18
 <tr style="border-top:1px solid;">
    <tr style="border-top:1px solid;">19
 <td colspan="2" style="height: 24px;">
        <td colspan="2" style="height: 24px;">20
 <asp:FileUpload ID="FileUpload1" runat="server" Width="240px" /></td>
            <asp:FileUpload ID="FileUpload1" runat="server" Width="240px" /></td>21
 </tr>
    </tr>22
 <tr style="border-top:1px solid;">
   <tr style="border-top:1px solid;">23
 <td colspan="2">
       <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>
            <asp:Button ID="UploadButton" runat="server" OnClick="UploadButton_Click" Text="Upload file" /><asp:Label ID="UploadStatusLabel" runat="server" ForeColor="Red"></asp:Label>25
 </td>
       </td>26
 </tr>
    </tr>27
 </table>
</table>28
 <hr />
<hr />29

代码:
 using System;
using System;2
 using System.Data;
using System.Data;3
 using System.Configuration;
using System.Configuration;4
 using System.Collections;
using System.Collections;5
 using System.Web;
using System.Web;6
 using System.Web.Security;
using System.Web.Security;7
 using System.Web.UI;
using System.Web.UI;8
 using System.Web.UI.WebControls;
using System.Web.UI.WebControls;9
 using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls.WebParts;10
 using System.Web.UI.HtmlControls;
using System.Web.UI.HtmlControls;11
 using Microsoft.SharePoint;
using Microsoft.SharePoint;12
 using System.IO;
using System.IO;13

14
 namespace FileUploadSolution
namespace FileUploadSolution15
 {
{16
 public partial class FileUploadOnMoss : System.Web.UI.UserControl
    public partial class FileUploadOnMoss : System.Web.UI.UserControl17
 {
    {18
 protected void Page_Load(object sender, EventArgs e)
        protected void Page_Load(object sender, EventArgs e)19
 {
        {20
 if(!IsPostBack)
            if(!IsPostBack)21
 {
              {22
 BindListTitle();
                BindListTitle();23
 }
             }24
 }
        }25
 //上传按钮事件
        //上传按钮事件26
 protected void UploadButton_Click(object sender, EventArgs e)
        protected void UploadButton_Click(object sender, EventArgs e)27
 {
        {28
 Boolean fileOK = false;
            Boolean fileOK = false;29
 string fileurl = FileUpload1.PostedFile.FileName;
            string fileurl = FileUpload1.PostedFile.FileName;30
 string filename=FileUpload1.FileName;
            string filename=FileUpload1.FileName;31
 SPWeb web = SPContext.Current.Web;
            SPWeb web = SPContext.Current.Web;32
 string pathToCheckUrl = string.Empty;
            string pathToCheckUrl = string.Empty;33
 string pathToCheck = string.Empty;
            string pathToCheck = string.Empty;34
 if (FolderNameDrp.SelectedValue!="")
            if (FolderNameDrp.SelectedValue!="")35
 {
            {36
 pathToCheckUrl= web.Lists[ListTitleNameDrp.SelectedValue].RootFolder.SubFolders[FolderNameDrp.SelectedValue].Url;
                pathToCheckUrl= web.Lists[ListTitleNameDrp.SelectedValue].RootFolder.SubFolders[FolderNameDrp.SelectedValue].Url;37
 }
            }38
 else
            else39
 {
            {40
 pathToCheckUrl = web.Lists[ListTitleNameDrp.SelectedValue].RootFolder.Url;
                pathToCheckUrl = web.Lists[ListTitleNameDrp.SelectedValue].RootFolder.Url;41
 }
            }42
 pathToCheck = pathToCheckUrl +'/'+ filename;//获取文件所在的路径
            pathToCheck = pathToCheckUrl +'/'+ filename;//获取文件所在的路径43
 
           44
 if (FileUpload1.HasFile)//判断上传文件是否加载了文件源
            if (FileUpload1.HasFile)//判断上传文件是否加载了文件源45
 {
            {46
 String fileExtension =System.IO.Path.GetExtension(filename).ToLower();
                String fileExtension =System.IO.Path.GetExtension(filename).ToLower();47
 //获取文件后缀名名与自行规定的文件类型进行匹配
                //获取文件后缀名名与自行规定的文件类型进行匹配48
 String[] allowedExtensions =
                String[] allowedExtensions = 49
 { ".doc", ".docx", ".pptx", ".xlsx", ".ppt" };
                { ".doc", ".docx", ".pptx", ".xlsx", ".ppt" };50
 for (int i = 0; i < allowedExtensions.Length; i++)
                for (int i = 0; i < allowedExtensions.Length; i++)51
 {
                {52
 if (fileExtension == allowedExtensions[i])
                    if (fileExtension == allowedExtensions[i])53
 {
                    {54
 fileOK = true;
                        fileOK = true;55
 }
                    }56
 }
                }57
 }
            }58
 if (fileOK)
            if (fileOK)59
 {
            {60
 try
                try61
 {
                {62
 if (System.IO.File.Exists(pathToCheck))//检索同目录下是否已存在了相同的文件名
                    if (System.IO.File.Exists(pathToCheck))//检索同目录下是否已存在了相同的文件名63
 {
                    {64
 //throw new ArgumentException(String.Format("{0} 该文件名已经存在!", filename), "filename");
                        //throw new ArgumentException(String.Format("{0} 该文件名已经存在!", filename), "filename");65
 }
                    }66
 else
                    else67
 {
                    {68
 FileUpload(fileurl, filename);
                        FileUpload(fileurl, filename);69
 UploadStatusLabel.Text = "上传成功!";
                        UploadStatusLabel.Text = "上传成功!";70
 
                                            71
 }
                    }72
 }
                }73
 catch
                catch74
 {    //当同个目录下存在同名文件时,做出错误的提示!
                {    //当同个目录下存在同名文件时,做出错误的提示!75
 UploadStatusLabel.Text = "上传失败!该文件名已存在!";
                    UploadStatusLabel.Text = "上传失败!该文件名已存在!";76
 
                77
 }
                }78
 }
            }79
 else
            else 80
 {
            {81
 UploadStatusLabel.Text = "抱歉!系统不支持你所上传的文档类型";
                UploadStatusLabel.Text = "抱歉!系统不支持你所上传的文档类型";82
 }
            }83

84
 
            85
 }
        }86
 //绑定当前站点所有列表的标题
        //绑定当前站点所有列表的标题87
 public void BindListTitle()
        public void BindListTitle()88
 {
        {89
 SPWeb web = SPContext.Current.Web;
            SPWeb web = SPContext.Current.Web;90
 string text = "====请选择====";
            string text = "====请选择====";91
 string value = string.Empty;
            string value = string.Empty;92
 ListTitleNameDrp.Items.Add(new ListItem(text, value));
            ListTitleNameDrp.Items.Add(new ListItem(text, value));93
 foreach (SPList MyList in web.Lists)
            foreach (SPList MyList in web.Lists)94
 {  //取得网站中所有列表的标题,绑定到列表下拉框
              {  //取得网站中所有列表的标题,绑定到列表下拉框95
 
                   96
 ListTitleNameDrp.Items.Add(MyList.Title);
                   ListTitleNameDrp.Items.Add(MyList.Title);    97
 }
              }98
 
                    99
 }
        }100
 //绑定指定列表下的文件名
        //绑定指定列表下的文件名101
 protected void ListTitleNameDrp_SelectedIndexChanged(object sender, EventArgs e)
       protected void ListTitleNameDrp_SelectedIndexChanged(object sender, EventArgs e)102
 {
        {103
 string ListTitle = ListTitleNameDrp.SelectedValue;
            string ListTitle = ListTitleNameDrp.SelectedValue;104
 SPList Mylist=SPContext.Current.Web.Lists[ListTitle];
            SPList Mylist=SPContext.Current.Web.Lists[ListTitle];105
 string text ="====请选择====";
            string text ="====请选择====";106
 string value = string.Empty;
            string value = string.Empty;107
 FolderNameDrp.Items.Add(new ListItem(text, value));
            FolderNameDrp.Items.Add(new ListItem(text, value));108
 foreach (SPListItem FolderItem in Mylist.Folders)
            foreach (SPListItem FolderItem in Mylist.Folders)109
 {
            {110
 if (FolderItem.Name != "Forms")//排除为Forms的文件夹
                if (FolderItem.Name != "Forms")//排除为Forms的文件夹111
 {
                {112
 
                      113
 FolderNameDrp.Items.Add(FolderItem.Name);
                    FolderNameDrp.Items.Add(FolderItem.Name);114
 }
                }115
 }
            }116
 }
        }117
 
    118
 //文件上传
        //文件上传 119
 public void FileUpload( string fileurl,string filename)
        public void FileUpload( string fileurl,string filename)120
 {
        {121
 SPSecurity.RunWithElevatedPrivileges(delegate()//模仿管理员的权限进行操作(代码访问权限提升)
            SPSecurity.RunWithElevatedPrivileges(delegate()//模仿管理员的权限进行操作(代码访问权限提升)122
 {
            { 123
 using(SPSite site=new SPSite(SPContext.Current.Site.ID))//实例化SPWeb对象才能保证执行者是管理员
               using(SPSite site=new SPSite(SPContext.Current.Site.ID))//实例化SPWeb对象才能保证执行者是管理员124
 {
               {125
 site.AllowUnsafeUpdates = true;
                    site.AllowUnsafeUpdates = true;126
 using (SPWeb web =site.AllWebs[SPContext.Current.Web.ID])
                    using (SPWeb web =site.AllWebs[SPContext.Current.Web.ID])127
 {
                   {128
 web.AllowUnsafeUpdates = true;
                       web.AllowUnsafeUpdates = true;129

130
 if (!File.Exists(fileurl))//判断文件是否已加载
                       if (!File.Exists(fileurl))//判断文件是否已加载131
 {
                       {132
 throw new ArgumentException(String.Format("{0} does not exist", fileurl), "fileurl");
                           throw new ArgumentException(String.Format("{0} does not exist", fileurl), "fileurl");133
 }
                       }134
 SPList Mylist = web.Lists[ListTitleNameDrp.SelectedValue];
                       SPList Mylist = web.Lists[ListTitleNameDrp.SelectedValue];135
 FileStream fstream = File.OpenRead(fileurl);//以文件流的形式读取文件源
                       FileStream fstream = File.OpenRead(fileurl);//以文件流的形式读取文件源136
 byte[] contens = new byte[fstream.Length];//定义一个直接数组
                       byte[] contens = new byte[fstream.Length];//定义一个直接数组137
 fstream.Read(contens, 0, (int)fstream.Length);//把文件源写入到数组容器
                       fstream.Read(contens, 0, (int)fstream.Length);//把文件源写入到数组容器138
 fstream.Close();//关闭文件流
                       fstream.Close();//关闭文件流139
 if (FolderNameDrp.SelectedValue == "")
                       if (FolderNameDrp.SelectedValue == "")140
 {    //当用户不选指定文件时,默认存放在根目录
                       {    //当用户不选指定文件时,默认存放在根目录141
 SPFile file = Mylist.RootFolder.Files.Add(filename, contens);
                           SPFile file = Mylist.RootFolder.Files.Add(filename, contens);142
 SPListItem item = file.Item;//通过文件对象获取item
                           SPListItem item = file.Item;//通过文件对象获取item143
 int id1 = item.ID;//获取该列表的唯一ID
                           int id1 = item.ID;//获取该列表的唯一ID144
 AddUserpepodom(id1);
                           AddUserpepodom(id1);145
 
                           146
 }
                       }147
 else
                       else148
 {
                       {149
 Guid id = Guid.Empty;
                           Guid id = Guid.Empty;150
 foreach (SPListItem folderItem in Mylist.Folders)
                           foreach (SPListItem folderItem in Mylist.Folders)151
 {
                           {152
 if (folderItem.Name == FolderNameDrp.SelectedValue)
                               if (folderItem.Name == FolderNameDrp.SelectedValue)153
 {
                               {154
 id = folderItem.UniqueId;//获取匹配的文件GUID
                                   id = folderItem.UniqueId;//获取匹配的文件GUID155
 break;
                                   break;156
 }
                               }157
 }
                           }158

159
 SPFolder folder = web.GetFolder(id);//通过GUID 获取文件夹
                           SPFolder folder = web.GetFolder(id);//通过GUID 获取文件夹160
 SPFile file = folder.Files.Add(filename, contens);//把文件加载到指定的文件夹目录
                           SPFile file = folder.Files.Add(filename, contens);//把文件加载到指定的文件夹目录161
 SPListItem item = file.Item;//通过file对象获得item
                           SPListItem item = file.Item;//通过file对象获得item162
 int id2 = item.ID;//获取每个列表项的唯一ID
                           int id2 = item.ID;//获取每个列表项的唯一ID 163
 AddUserpepodom(id2);
                           AddUserpepodom(id2);164
 
                         165
 }
                       }166
 }
                   }167
 }
               }168
 });
           });169
 }
        }170

171
 //重新分配文档权限(以下代码段可以实现具体某个用户对某一个文档所拥有的权限)
        //重新分配文档权限(以下代码段可以实现具体某个用户对某一个文档所拥有的权限)172
 public void AddUserpepodom(int id)
        public void AddUserpepodom(int id)173
 {
        { 174
 //提升用户访问权限(模拟管理员权限)
            //提升用户访问权限(模拟管理员权限)175
 
           176
 SPSecurity.RunWithElevatedPrivileges(delegate()
           SPSecurity.RunWithElevatedPrivileges(delegate()   177
 {
               {178
 //通过唯一ID获取当前站点集
                 //通过唯一ID获取当前站点集179
 using (SPSite site = new SPSite(SPContext.Current.Site.ID))
                using (SPSite site = new SPSite(SPContext.Current.Site.ID))    180
 {
                {181
 //通过唯一ID获取当前站点
                    //通过唯一ID获取当前站点182
 using (SPWeb web = site.AllWebs[SPContext.Current.Web.ID])
                    using (SPWeb web = site.AllWebs[SPContext.Current.Web.ID]) 183
 {
                    {184
 //获得用户选定的列表
                        //获得用户选定的列表185
 SPList list = web.Lists[ListTitleNameDrp.SelectedValue];
                        SPList list = web.Lists[ListTitleNameDrp.SelectedValue];    186
 //通过列表项ID获取可以确保该列表项唯一性
                        //通过列表项ID获取可以确保该列表项唯一性187
 SPListItem item = list.Items.GetItemById(id);
                        SPListItem item = list.Items.GetItemById(id);188
 //不继承父类权限
                        //不继承父类权限189
 item.BreakRoleInheritance(true);
                        item.BreakRoleInheritance(true);190
 //清除该列表条目原有的所有角色权限
                        //清除该列表条目原有的所有角色权限191
 foreach (SPRoleAssignment roleassignments in item.RoleAssignments)
                        foreach (SPRoleAssignment roleassignments in item.RoleAssignments)192
 {
                        {193
 //表示允许更新site and web
                            //表示允许更新site and web194
 site.AllowUnsafeUpdates = true;
                            site.AllowUnsafeUpdates = true;195
 web.AllowUnsafeUpdates = true;
                            web.AllowUnsafeUpdates = true;196
 roleassignments.RoleDefinitionBindings.RemoveAll();
                            roleassignments.RoleDefinitionBindings.RemoveAll();197
 //记得重新更新下列表条目
                            //记得重新更新下列表条目198
 item.Update();
                            item.Update();199

200
 }
                        }201
 //获取该站点当前登录的用户(这步的目的就是为了让只有只读权限的用户也拥有对他所上传的文档进行编辑的权限。
                        //获取该站点当前登录的用户(这步的目的就是为了让只有只读权限的用户也拥有对他所上传的文档进行编辑的权限。202
 //<在实际企业应用还时很实用的,例如一个企业,一些权限低的员工上传文档,如果没进行权限提升,那他就没权限修改自己所上传的文档,只有查看咯>)
                        //<在实际企业应用还时很实用的,例如一个企业,一些权限低的员工上传文档,如果没进行权限提升,那他就没权限修改自己所上传的文档,只有查看咯>)203
 string UserLoginName=SPContext.Current.Web.CurrentUser.LoginName;
                        string UserLoginName=SPContext.Current.Web.CurrentUser.LoginName;204
 //SPUser authorUser = web.AllUsers["mosing\\yongfengisvan"];
                        //SPUser authorUser = web.AllUsers["mosing\\yongfengisvan"];205
 SPUser authorUser = web.AllUsers[UserLoginName];
                        SPUser authorUser = web.AllUsers[UserLoginName];206
 //对用户进行角色分配
                        //对用户进行角色分配207
 SPRoleAssignment roleassignment = new SPRoleAssignment(authorUser.LoginName, authorUser.Email, authorUser.Name, authorUser.Notes);
                        SPRoleAssignment roleassignment = new SPRoleAssignment(authorUser.LoginName, authorUser.Email, authorUser.Name, authorUser.Notes);208
 //重新进行角色定义.
                        //重新进行角色定义.209
 roleassignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.Administrator));
                        roleassignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.Administrator));210
 item.RoleAssignments.Add(roleassignment);
                        item.RoleAssignments.Add(roleassignment);211
 item.Update();
                        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号
浙公网安备 33010602011771号