ローカル フォルダから SharePoint サイトにファイルをアップロードする
このプログラミング作業は、ローカル フォルダから Windows SharePoint Services サイト上のフォルダにファイルをアップロードする方法を示しています。EnsureParentFolder メソッドを使用して、アップロード先フォルダが存在することを確認します。
手順
ローカル フォルダから SharePoint サイト上のフォルダにファイルをアップロードするには
「[方法] 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 アセンブリに対して表示される情報から取得できます。
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>
.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 である必要があります。絶対 URL は destUrl パラメータに割り当てられます。
親サイト用の SPWeb オブジェクトをインスタンス化することに加え、SPSite コンストラクタと OpenWeb メソッドの併用により、URL を検証して URL が現在の Windows SharePoint Services 展開によって処理されない場合は引数例外をスローします。System.Web.UI.HtmlControls.HtmlInputFile オブジェクトを使用して、SPFileCollection クラスの Add メソッドで使用するバイト配列にアップロード元ファイルを読み込みます。
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; }
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 (英語)