質問者
CSOM にて SPO にファイルをアップロードする方法

質問
-
ルートフォルダー配下の任意のフォルダーに対し、複数のローカルファイルをアップしたいのですが、GetFolderByServerRelativeUrl が \ を許可しないためか、null 値の式ではメソッドを呼び出せません。とエラーが生じ、実現できません。
※$List.RootFolder.Files.Add にすればアップできます。
ソースは以下の通りです。
ーーーーーーーー
Param( [string]$webUrl , [string]$localFolder , [string]$libraryName, [string]$FolderName )
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($webUrl)
$user = "****@test.com";
$SecurePassword = "*****" | ConvertTo-SecureString -AsPlainText -Force
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $SecurePassword);$List = $ctx.Web.Lists.GetByTitle($LibraryName)
$ctx.Load($List)
$ctx.ExecuteQuery()
$int = 0;
foreach($File in (dir $localFolder -File))
{
$FileStream = New-Object IO.FileStream($File.FullName,[System.IO.FileMode]::Open)
$FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
$FileCreationInfo.Overwrite = $true
$FileCreationInfo.ContentStream = $FileStream
$TargetFolder = $webUrl +
$TargetFolder = $ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName);
$FileCreationInfo.URL = $File.Name
$Upload = $TargetFolder.Files.Add($FileCreationInfo.URL)
$ctx.Load($Upload)
$ctx.ExecuteQuery()
$int++
Write-Host $File ":Upload"
}
Write-Host $int "Files:Upload Finish"
$ctx.Dispose()- 種類を変更済み 栗下 望Microsoft employee, Moderator 2018年4月20日 5:57 質問と思われる投稿内容のため種類を変更いたしました
すべての返信
-
色々いじっていたので、ソースにゴミがありました。すみません。
下記を実行すると、#①は成功するのですが、#②は失敗してしまいます。
>C:\Users\Admin\Desktop\Teams\upload.ps1 -webUrl "https://hitocoto.sharepoint.com/sites/aaaaa482" -localFolder "C:\Users\Admin\Desktop\最終" -libraryName "ドキュメント" -FolderName "Shared Documents/General"
エラーの一部です。
a.txt :Upload
"1" 個の引数を指定して "Add" を呼び出し中に例外が発生しました: "閉じているファイルにはアクセスできません。"
発生場所 C:\Users\Admin\Desktop\Teams\upload.ps1:40 文字:5
+ $Upload = $TargetFolder.Files.Add($FileCreationInfo)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ObjectDisposedException
"0" 個の引数を指定して "ExecuteQuery" を呼び出し中に例外が発生しました: "無効な要求です。"
発生場所 C:\Users\Admin\Desktop\Teams\upload.ps1:42 文字:5
+ $ctx.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServerException
ーーーーーーーーーーーー
Param( [string]$webUrl , [string]$localFolder , [string]$libraryName, [string]$FolderName )
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($webUrl)
$user = "*****@test.com";
$SecurePassword = "*****" | ConvertTo-SecureString -AsPlainText -Force
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $SecurePassword);
$List = $ctx.Web.Lists.GetByTitle($LibraryName)
$ctx.Load($List)
$ctx.ExecuteQuery()
$int = 0;
foreach($File in (dir $localFolder -File))
{
$FileStream = New-Object IO.FileStream($File.FullName,[System.IO.FileMode]::Open)
$FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
$FileCreationInfo.Overwrite = $true
$FileCreationInfo.ContentStream = $FileStream
$FileCreationInfo.URL = $File.Name
#①
$Upload = $List.RootFolder.Files.Add($FileCreationInfo)
$ctx.Load($Upload)
$ctx.ExecuteQuery()
#②
$TargetFolder = $ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName);
$Upload = $TargetFolder.Files.Add($FileCreationInfo)
$ctx.Load($Upload)
$ctx.ExecuteQuery()
$int++
Write-Host $File ":Upload"
}
Write-Host $int "Files:Upload Finish"
$ctx.Dispose() -
ご連絡ありがとうございます。それが、
$TargetFolder = $ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName);
$Upload = $TargetFolder.Files.Add($FileCreationInfo)
$ctx.Load($Upload)
$ctx.ExecuteQuery()のみでも同様のエラーが生じまして・・・・
デバックすると、$TargetFolder = $ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName); で $TargetFolder がnull のままですので、フォルダーの受け渡しがうまくいっていない気がしておりますが・・・・色々やっても解決できず、ご相談させていただいております。
※別原因の可能性もありますが。。。。。
a.txt :Upload
"0" 個の引数を指定して "ExecuteQuery" を呼び出し中に例外が発生しました: "Server relative urls must start with SPWeb.ServerRelativeUrl"
発生場所 C:\Users\Admin\Desktop\Teams\upload.ps1:38 文字:5
+ $ctx.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServerException- 編集済み (_ _) 2018年4月20日 7:07
-
$TargetFolderがnullなのであれば、$ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName)が失敗している可能性があるかと思います。
$List.RootFolder.ServerRelativeUrl + "/" + $FolderName はちゃんと想定通りの値となっていますか?
GetFolderByServerRelativeUrl()がエラーを出しているとすれば、そのエラーメッセージはどうなっていますか?
一般論になりますが、一連の処理で一番最初に出たエラー内容を突き止め、そのエラーを解消しない限りは解決に至らないものと思います。正常に動作することを期待した処理がエラーになった場合、その後続処理が意図通りに動かなかったり、エラーまみれになるのは、ある意味当然ですので…。