如何:将文件从本地文件夹上载到 SharePoint 网站

上次修改时间: 2010年7月7日

适用范围: SharePoint Foundation 2010

在 SharePoint Online 中提供

此编程任务演示如何将文件从本地文件夹上载到 Microsoft SharePoint Foundation 网站上的文件夹中。该任务使用 EnsureParentFolder 方法以确保目标文件夹存在。

过程

将文件从本地文件夹上载到 SharePoint 网站上的文件夹中

  1. 在 Microsoft Visual Studio 2010 中创建应用程序页,如为 SharePoint 创建应用程序页中所述。

  2. 将 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>
    
  3. 在 .aspx.cs 代码隐藏文件中,为 System.IO 和 Microsoft.SharePoint 命名空间添加 using 指令,如下所示。

    Imports System.IO
    Imports Microsoft.SharePoint
    
    using System.IO;
    using Microsoft.SharePoint;
    
  4. 将下面的代码添加到按钮的 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 方法一起使用。

  5. 该示例定义一个 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;
    }
    
  6. SPWeb 类的 GetFile 方法与 SPFile 类的 Url 属性结合使用可将 URL 转换为相对于网站的 URL,如果在网站范围内找不到指定的 URL,则会引发异常。通过使用 String.LastIndexOf 方法计算父文件夹的 URL,以确定目标 URL 中的左斜线 (/) 的最后外观。如果没有斜杠(也就是说,索引等于 -1),则目标为网站的根文件夹且 parentFolderUrl 参数返回空字符串。否则,该示例将使用 SPWeb 类的 GetFolder 方法返回目标父文件夹。如果该文件夹不存在,则示例将构造该文件夹。

若要上载来自运行 SharePoint Foundation 的同一服务器上的本地文件夹中的文件,可以改用 FileStream 对象。在此情况下,除了为 SystemMicrosoft.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。

请参阅

概念

使用列表对象和集合

使用 Visual Studio 进行 SharePoint 开发

安全验证并进行发布以更新数据

特权提升