rustynails
rustynails

Reputation: 129

Uploading to SharepointOnline subfolder using Powershell

it seems like I can upload a file to SPO's Site Collection URL but not the subfolder. For example, I can upload to "https://xyz.sharepoint.com/sites/Reporting", but not "https://xyz.sharepoint.com/sites/Reporting/Sales". Here's the working code's relevant bit:

$Username = "[email protected]"
$Password = "Password"
$SiteCollectionUrl = "https://xyz.sharepoint.com/sites/Reporting"
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$DocLibName = "Sales"

$Folder="C:\MySalesFolder"

    Function Get-SPOCredentials([string]$UserName,[string]$Password)
    {
       $SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
       return New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, $SecurePassword)
    }
     $Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl)
     $Context.Credentials = Get-SPOCredentials -UserName $UserName -Password $Password

    #Retrieve list
    $List = $Context.Web.Lists.GetByTitle($DocLibName)
    $Context.Load($List)
    $Context.ExecuteQuery()

    #Upload file
    Foreach ($File in (dir $Folder -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
    $Upload = $List.RootFolder.Files.Add($FileCreationInfo)
    $Context.Load($Upload)
    $Context.ExecuteQuery() 

I tried to hardcode "/Sales" subfolder but no luck. Anyone can point me in the right direction?

Upvotes: 1

Views: 3347

Answers (1)

dwarfsoft
dwarfsoft

Reputation: 346

According to Trying to upload files to subfolder in Sharepoint Online via Powershell You will need to amend the FileCreationURL:

$FileCreationInfo.URL = $List.RootFolder.ServerRelativeUrl + "/" + $FolderName + "/" + $File.Name

I believe you just need to prepend $File.Name with the Folder path to your root directory.

Web.GetFolderByServerRelativeUrl Method:

Alternatively to attempting to Upload via List.RootFolder..., you can use the "GetFolderByServerRelativeUrl" method to get your Target Folder

$List = $Context.Web.Lists.GetByTitle($DocLibName)
$Context.Load($List.RootFolder) 
$Context.ExecuteQuery()
$FolderName = "Sales"

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

Then for upload you would use

$FileCreationInfo.URL = $File.Name
$UploadFile = $TargetFolder.Files.Add($FileCreationInfo)
$Context.Load($UploadFile)
$Context.ExecuteQuery()

Upvotes: 1

Related Questions