none
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()

    2018年4月20日 4:39

すべての返信

  •    $TargetFolder = $webUrl + 
        $TargetFolder = $ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName);

    この部分に構文エラーがあるようですが、そこは大丈夫でしょうか?

    それと、エラーが発生した行を含むエラーメッセージをすべて提示いただいた方が、回答が得られやすいと思います。

    2018年4月20日 5:24
    モデレータ
  • フォーラム オペレーターの栗下 望です。
    わからない (_w_) さん、こんにちは。

    「全般的な情報交換」形式で投稿されていましたので、
    質問の内容から「質問形式」に変更させていただきました。

    「全般的な情報交換」形式ですと、回答が寄せられても[回答としてマーク]を設定することが出来ませんので、
    ご留意いただければと思います。

    どうぞよろしくお願いいたします。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 栗下 望

    2018年4月20日 6:02
    モデレータ
  • 色々いじっていたので、ソースにゴミがありました。すみません。

    下記を実行すると、#①は成功するのですが、#②は失敗してしまいます。

    >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()

    2018年4月20日 6:27
  • マナーを把握しておらず、ご迷惑をおかけしております。今後は、質問形式にて質問されていただきます。ありがとうございます。
    2018年4月20日 6:28
  • エラーメッセージを素直に解釈すれば、$FileCreationInfoに格納されたファイルをRootFolderにAddしアップロードが完了すると、そのファイルは閉じられてしまうので、$TargetFolderに同じファイルを続けてAddしようとしてエラーが出ている感じでしょうか。

    $TargetFolderにAddする直前に、$FileCreationInfoを作り直す必要があるのではないでしょうか。

    2018年4月20日 6:54
    モデレータ
  • ご連絡ありがとうございます。それが、

    $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:05
  • $TargetFolderがnullなのであれば、$ctx.Web.GetFolderByServerRelativeUrl($List.RootFolder.ServerRelativeUrl + "/" + $FolderName)が失敗している可能性があるかと思います。

    $List.RootFolder.ServerRelativeUrl + "/" + $FolderName はちゃんと想定通りの値となっていますか?

    GetFolderByServerRelativeUrl()がエラーを出しているとすれば、そのエラーメッセージはどうなっていますか?

    一般論になりますが、一連の処理で一番最初に出たエラー内容を突き止め、そのエラーを解消しない限りは解決に至らないものと思います。正常に動作することを期待した処理がエラーになった場合、その後続処理が意図通りに動かなかったり、エラーまみれになるのは、ある意味当然ですので…。

    2018年4月20日 12:05
    モデレータ