C# CSOM SPOへファイルをアップする際ContentStreamでハマった話

.net CoreでCSOMを使用したとき、ある程度の大きさのファイルをドキュメントライブラリへアップしようとしてエラーが発生した。

中々そのエラーが解消できなくてはまったので、メモ。

スポンサーリンク

FileCreationクラスを選択。

C#からドキュメントライブラリへファイルをアップする方法は色々あるが、今回はFileCreationクラスを使用する方法を選択。

最初はFileCreationクラスのContentプロパティを使用していたが、アップするファイルが2MBを超えていることがわかったので、ContentStreamプロパティを使用することにした。
ファイルサイズとライブラリとの関係は下の公式ページに詳しく書いてある。
大きいファイルをアップロードするサンプル アドイン (SharePoint)
SaveBinaryDirect、ContentStream、StartUpload、ContinueUpload、FinishUploadUpload を使用して、2 MB を超えるファイルを SharePoint および SharePo...

ちなみに、SaveBinaryDirectメソッドを使用すると簡単にサイズ無制限でファイルを上げることができるらしいが、.Net Coreではこのメソッドは使用できない。
このメソッドが入っているdllは.net Frameworkには対応しているが.net Coreには対応していないよう。

代わりにSaveBinaryメソッドが用意されているので、こちらの使い方もそのうち調べてみたい。

ContentStreamプロパティではまった

今回、このContentStreamプロパティでドはまりした。

XMLDocumentの内容をアップしたかったのでこんな感じのコードを書いたのだが、

XmlDocument doc = new XmlDocument();
doc.LoadXml(XML文字列);

List spList = context.Web.Lists.GetById("xxx-xxx-xxx-xxx"));
using (MemoryStream ms = new MemoryStream())
{
    FileCreationInformation fileCreation = new FileCreationInformation();
    doc.Save(ms);
    fileCreation.ContentStream = ms;
    fileCreation.Url = "hogehoge.xml";
    Microsoft.SharePoint.Client.File uploadFile = spList.RootFolder.Files.Add(fileCreation);
    context.Load<Microsoft.SharePoint.Client.File>(uploadFile);
    context.ExecuteQueryAsync().Wait();
}

ExecuteQueryAsyncが必ず
「specified argument was out of the range of valid values.」
みたいな例外を投げてくる。

しばらく理由がわからずはまっていたのだが、大事な1行が抜けていることに気がついた
そう、Seekだ!!

ということで完成のコードはこちら

XmlDocument doc = new XmlDocument();
doc.LoadXml(XML文字列);

List spList = context.Web.Lists.GetById("xxx-xxx-xxx-xxx"));
using (MemoryStream ms = new MemoryStream())
{
    FileCreationInformation fileCreation = new FileCreationInformation();
    doc.Save(ms);
    ms.Seek(0, SeekOrigin.Begin);
    fileCreation.ContentStream = ms;
    fileCreation.Url = "hogehoge.xml";
    Microsoft.SharePoint.Client.File uploadFile = spList.RootFolder.Files.Add(fileCreation);
    context.Load<Microsoft.SharePoint.Client.File?(uploadFile);
    context.ExecuteQueryAsync().Wait();
}

XMLDocument.SaveしたらStreamの読み込み位置は末尾に行く。
よく考えれば当たり前すぎて恥ずかしい。。。

Streamの現在位置には気を付けよう!というタイトルと若干関係ない結論。
あー恥ずかしw

コメント

タイトルとURLをコピーしました