如何:将文件从本地文件夹上载到 SharePoint 网站
上次修改时间: 2010年7月7日
适用范围: SharePoint Foundation 2010
此编程任务演示如何将文件从本地文件夹上载到 Microsoft SharePoint Foundation 网站上的文件夹中。该任务使用 EnsureParentFolder 方法以确保目标文件夹存在。
过程
将文件从本地文件夹上载到 SharePoint 网站上的文件夹中
在 Microsoft Visual Studio 2010 中创建应用程序页,如为 SharePoint 创建应用程序页中所述。
将 HtmlInputFile 控件、文本框和按钮添加到表单中,并将 FormDigest 控件添加到页面中。
<form id="Form1" method="post" runat="server"> <SharePoint:FormDigest runat="server" /> <input id="File1" type="file" runat="server" title="upldFileBox"> <asp:Button id="Button1" runat="server" Text="Upload File"></asp:Button> <asp:TextBox id="TextBox1" runat="server"></asp:TextBox> </form>
在 .aspx.cs 代码隐藏文件中,为 System.IO 和 Microsoft.SharePoint 命名空间添加 using 指令,如下所示。
Imports System.IO Imports Microsoft.SharePoint
using System.IO; using Microsoft.SharePoint;
将下面的代码添加到按钮的 Click 事件中:
If File1.PostedFile Is Nothing Then Return End If Dim destUrl As String = TextBox1.Text Dim site As SPWeb = New SPSite(destUrl).OpenWeb() Dim fStream As Stream = File1.PostedFile.InputStream Dim contents(fStream.Length) As Byte fStream.Read(contents, 0, CInt(fStream.Length)) fStream.Close() EnsureParentFolder(site, destUrl) site.Files.Add(destUrl, contents)
if (File1.PostedFile == null) return; string destUrl = TextBox1.Text; SPWeb site = new SPSite(destUrl).OpenWeb(); Stream fStream = File1.PostedFile.InputStream; byte[] contents = new byte[fStream.Length]; fStream.Read(contents, 0, (int)fStream.Length); fStream.Close(); EnsureParentFolder(site, destUrl); site.Files.Add(destUrl, contents);
在文本框中为目标键入的值必须是一个绝对 URL,其中包括分配给 destUrl 参数的文件名。
除了实例化父网站的 SPWeb 对象之外,将 SPSite 构造函数和 OpenWeb 方法结合使用将验证 URL,并会在当前 SharePoint Foundation 部署未提供此 URL 的情况下引发参数异常。HtmlInputFile 对象用于将源文件读入字节数组以便与 SPFileCollection 类的 Add 方法一起使用。
该示例定义一个 EnsureParentFolder 方法,以确保目标 URL 中的父文件夹在指定网站中存在,并返回父文件夹相对于网站的 URL。EnsureParentFolder 方法接受两个参数:一个表示父网站的 SPWeb 对象,一个包含从该示例的 UploadFile 方法传递的绝对 URL 的字符串。如果父文件夹不存在,则 EnsureParentFolder 方法将创建它。
Public Function EnsureParentFolder(parentSite As SPWeb, destinUrl As String) As String destinUrl = parentSite.GetFile(destinUrl).Url Dim index As Integer = destinUrl.LastIndexOf("/") Dim parentFolderUrl As String = String.Empty If index > - 1 Then parentFolderUrl = destinUrl.Substring(0, index) Dim parentFolder As SPFolder = parentSite.GetFolder(parentFolderUrl) If Not parentFolder.Exists Then Dim currentFolder As SPFolder = parentSite.RootFolder Dim folder As String For Each folder In parentFolderUrl.Split("/"c) currentFolder = currentFolder.SubFolders.Add(folder) Next folder End If End If Return parentFolderUrl End Function 'EnsureParentFolder
public string EnsureParentFolder(SPWeb parentSite, string destinUrl) { destinUrl = parentSite.GetFile(destinUrl).Url; int index = destinUrl.LastIndexOf("/"); string parentFolderUrl = string.Empty; if (index > -1) { parentFolderUrl = destinUrl.Substring(0, index); SPFolder parentFolder = parentSite.GetFolder(parentFolderUrl); if (! parentFolder.Exists) { SPFolder currentFolder = parentSite.RootFolder; foreach(string folder in parentFolderUrl.Split('/')) { currentFolder = currentFolder.SubFolders.Add(folder); } } } return parentFolderUrl; }
将 SPWeb 类的 GetFile 方法与 SPFile 类的 Url 属性结合使用可将 URL 转换为相对于网站的 URL,如果在网站范围内找不到指定的 URL,则会引发异常。通过使用 String.LastIndexOf 方法计算父文件夹的 URL,以确定目标 URL 中的左斜线 (/) 的最后外观。如果没有斜杠(也就是说,索引等于 -1),则目标为网站的根文件夹且 parentFolderUrl 参数返回空字符串。否则,该示例将使用 SPWeb 类的 GetFolder 方法返回目标父文件夹。如果该文件夹不存在,则示例将构造该文件夹。
若要上载来自运行 SharePoint Foundation 的同一服务器上的本地文件夹中的文件,可以改用 FileStream 对象。在此情况下,除了为 System 和 Microsoft.SharePoint 添加指令之外,还将为 System.IO 命名空间添加 using 指令。下面的示例使用 Click 事件处理程序来调用 UploadFile 方法,该方法反过来又调用前面描述的 EnsureParentFolder 方法。
Public Sub UploadFile(srcUrl As String, destUrl As String)
If Not File.Exists(srcUrl) Then
Throw New ArgumentException(String.Format("{0} does not exist",
srcUrl), "srcUrl")
End If
Dim site As SPWeb = New SPSite(destUrl).OpenWeb()
Dim fStream As FileStream = File.OpenRead(srcUrl)
Dim contents(fStream.Length) As Byte
fStream.Read(contents, 0, CInt(fStream.Length))
fStream.Close()
EnsureParentFolder(site, destUrl)
site.Files.Add(destUrl, contents)
End Sub 'UploadFile
public void UploadFile(string srcUrl, string destUrl)
{
if (! File.Exists(srcUrl))
{
throw new ArgumentException(String.Format("{0} does not exist",
srcUrl), "srcUrl");
}
SPWeb site = new SPSite(destUrl).OpenWeb();
FileStream fStream = File.OpenRead(srcUrl);
byte[] contents = new byte[fStream.Length];
fStream.Read(contents, 0, (int)fStream.Length);
fStream.Close();
EnsureParentFolder(site, destUrl);
site.Files.Add(destUrl, contents);
}
UploadFile 方法接受两个参数。srcUrl 参数指定本地计算机的文件系统中源位置的路径,而 destUrl 参数指定目标的绝对 URL。FileStream 对象用于将源文件读入字节数组以便与 SPFileCollection 类的 Add 方法一起使用。
备注
上载的文件的大小不能超过 2 GB。