SharePoint 2013 との間でファイルをダウンロード/アップロードする必要がある Win8 (WinRT、C#、XAML) クライアント アプリケーション (CSOM) を開発しています。
ダウンロード/アップロードの方法を教えてください。
SharePoint 2013 との間でファイルをダウンロード/アップロードする必要がある Win8 (WinRT、C#、XAML) クライアント アプリケーション (CSOM) を開発しています。
ダウンロード/アップロードの方法を教えてください。
この記事では、SharePoint コンテンツにアクセスするためのさまざまなオプションについて説明します。REST と CSOM のいずれかを選択できます。可能であれば、CSOM を試してみたいと思います。ファイルのアップロード/ダウンロードについては、この記事で詳しく説明しています。
全体的な注意事項:
//First construct client context, the object which will be responsible for
//communication with SharePoint:
var context = new ClientContext(@"http://site.absolute.url")
//then get a hold of the list item you want to download, for example
var list = context.Web.Lists.GetByTitle("Pipeline");
var query = CamlQuery.CreateAllItemsQuery(10000);
var result = list.GetItems(query);
//note that data has not been loaded yet. In order to load the data
//you need to tell SharePoint client what you want to download:
context.Load(result, items=>items.Include(
item => item["Title"],
item => item["FileRef"]
));
//now you get the data
context.ExecuteQuery();
//here you have list items, but not their content (files). To download file
//you'll have to do something like this:
var item = items.First();
//get the URL of the file you want:
var fileRef = item["FileRef"];
//get the file contents:
FileInformation fileInfo = File.OpenBinaryDirect(context, fileRef.ToString());
using (var memory = new MemoryStream())
{
byte[] buffer = new byte[1024 * 64];
int nread = 0;
while ((nread = fileInfo.Stream.Read(buffer, 0, buffer.Length)) > 0)
{
memory.Write(buffer, 0, nread);
}
memory.Seek(0, SeekOrigin.Begin);
// ... here you have the contents of your file in memory,
// do whatever you want
}
ストリームを直接操作することは避け、最初にメモリに読み込みます。ネットワークにバインドされたストリームは、パフォーマンスは言うまでもなく、必ずしもストリーム操作をサポートしているわけではありません。そのため、そのストリームから画像を読み取ったり、ドキュメントを解析したりすると、予期しない動作が発生する可能性があります。
余談ですが、上記のコードのパフォーマンスに関して関連する質問があります。ファイル要求ごとにペナルティが課せられるからです。ここを参照してください。はい、これには 4.5 の完全な .NET プロファイルが必要です。
Oauth アクセストークンを使用している場合、File.OpenBinaryDirect で例外が発生する場合があります。
例外を回避するために、コードは次のように記述する必要があります
Uri filename = new Uri(filepath);
string server = filename.AbsoluteUri.Replace(filename.AbsolutePath,
"");
string serverrelative = filename.AbsolutePath;
Microsoft.SharePoint.Client.File file =
this.ClientContext.Web.GetFileByServerRelativeUrl(serverrelative);
this.ClientContext.Load(file);
ClientResult<Stream> streamResult = file.OpenBinaryStream();
this.ClientContext.ExecuteQuery();
return streamResult.Value;
SharePoint 2013 のオンラインおよびオンプレミスのファイル エンコーディングは UTF-8 BOM です。ファイルが UTF-8 BOM であることを確認してください。そうしないと、アップロードされた HTML とスクリプトがブラウザーで正しくレンダリングされない可能性があります。
CSOM で何ができるかについては、Microsoft のドキュメントを読むことをお勧めします。これは探しているものの 1 つの例かもしれませんが、msdn に文書化された巨大な API があります。
// Starting with ClientContext, the constructor requires a URL to the
// server running SharePoint.
ClientContext context = new ClientContext("http://SiteUrl");
// Assume that the web has a list named "Announcements".
List announcementsList = context.Web.Lists.GetByTitle("Announcements");
// Assume there is a list item with ID=1.
ListItem listItem = announcementsList.Items.GetById(1);
// Write a new value to the Body field of the Announcement item.
listItem["Body"] = "This is my new value!!";
listItem.Update();
context.ExecuteQuery();