[方法] ローカル フォルダから SharePoint サイトにファイルをアップロードする
最終更新日: 2010年7月7日
適用対象: SharePoint Foundation 2010
このプログラミング作業は、ローカル フォルダーから Microsoft SharePoint Foundation サイト上のフォルダーにファイルをアップロードする方法を示しています。EnsureParentFolder メソッドを使用して、アップロード先フォルダーが存在することを確認します。
手順
ローカル フォルダーから SharePoint サイト上のフォルダーにファイルをアップロードするには
「Creating Application Pages for SharePoint (英語)」で説明されているように、Microsoft Visual Studio 2010 でアプリケーション ページを作成します。
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 である必要があります。絶対 URL は destUrl パラメータに割り当てられます。
親サイト用の SPWeb オブジェクトをインスタンス化することに加え、SPSite コンストラクターと OpenWeb メソッドの併用により、URL を検証して URL が現在の SharePoint Foundation 展開によって処理されない場合は引数例外をスローします。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 メソッドを使用してアップロード先親フォルダーを返します。フォルダーが存在しない場合は、作成します。
SharePoint Foundation を実行している同じサーバーのローカル フォルダーからファイルをアップロードするには、代わりに 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 を指定します。FileStream オブジェクトを使用して、SPFileCollection クラスの Add メソッドで使用するバイト配列にアップロード元ファイルを読み込みます。
注意
アップロードできるファイルのサイズは 2 GB までです。