次の方法で共有


ローカル フォルダから SharePoint サイトにファイルをアップロードする

このプログラミング作業は、ローカル フォルダから Windows SharePoint Services サイト上のフォルダにファイルをアップロードする方法を示しています。EnsureParentFolder メソッドを使用して、アップロード先フォルダが存在することを確認します。

手順

ローカル フォルダから SharePoint サイト上のフォルダにファイルをアップロードするには

  1. [方法] SharePoint Web サイトで Web アプリケーションを作成する」の説明に従って、Visual Studio 2005 で Web アプリケーションを作成します。FormDigest コントロールと Microsoft.SharePoint.WebControls 名前空間に対するページ ディレクティブを次のように .aspx ファイルに追加します。

    <%@ Register Tagprefix="SharePoint" 
          Namespace="Microsoft.SharePoint.WebControls" 
       Assembly="Microsoft.SharePoint, Version=12.0.0.0, 
          Culture=neutral, 
       PublicKeyToken=71e9bce111e9429c" %>
    

    注意

    現在の Windows SharePoint Services 展開の PublicKeyToken 値は、Local_Drive:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\SiteTemplates\sts フォルダの default.aspx ファイルから取得するか、エクスプローラで Local_Drive:\%WINDOWS%\assembly の Microsoft.SharePoint アセンブリに対して表示される情報から取得できます。

  2. HtmlInputFile コントロール、テキスト ボックス、およびボタンを, .aspx ページのフォームに追加します。

    <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 である必要があります。絶対 URL は destUrl パラメータに割り当てられます。

    親サイト用の SPWeb オブジェクトをインスタンス化することに加え、SPSite コンストラクタと OpenWeb メソッドの併用により、URL を検証して URL が現在の Windows SharePoint Services 展開によって処理されない場合は引数例外をスローします。System.Web.UI.HtmlControls.HtmlInputFile オブジェクトを使用して、SPFileCollection クラスの Add メソッドで使用するバイト配列にアップロード元ファイルを読み込みます。

  5. EnsureParentFolder メソッドは、指定されたサイトにアップロード先 URL の親フォルダが存在していることを確認し、親フォルダのサイト相対 URL を返します。EnsureParentFolder メソッドは 2 つのパラメータを受け付けます。1 つは親サイトを表す SPWeb オブジェクト、もう 1 つは 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 メソッドを使用してアップロード先親フォルダを返します。フォルダが存在しない場合は、作成します。

Windows SharePoint Services を実行している同じサーバーのローカル フォルダからファイルをアップロードするには、代わりに System.IO.FileStream オブジェクトを使用できます。この場合は、System と Microsoft.SharePoint に対する using ディレクティブに加えて、System.IO 名前空間に対するディレクティブを追加します。次の例は、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 メソッドは 2 つのパラメータを受け付けます。srcUrl パラメータはローカル コンピュータのファイル システムにおけるアップロード元の場所のパスを指定し、destUrl パラメータはアップロード先の絶対 URL を指定します。System.IO.FileStream オブジェクトを使用して、SPFileCollection クラスの Add メソッドで使用するバイト配列にアップロード元ファイルを読み込みます。

注意

アップロードできるファイルのサイズは 2 GB までです。

See Also

概念

Working with List Objects and Collections (英語)

Visual Studio で SharePoint Web サイトのプログラムによるカスタマイズ作業を開始する

データ更新のためのセキュリティ検証と投稿の作成

権限の昇格