Jan 29 2017 10:19 PM
I am trying to upload document to SharePoint Online using PowerShell / CSOM.
Issue is that I don't have file on local drive. I have URL of a file which I download as
$wc = New-Object System.Net.WebClient
$ByteArray = $wc.downloaddata(Document URL)
$ByteArray is a Byte array
When I try to user following code, it generates error
#Specify tenant admin and site URL and including DLL
$User = "XXXXX@XXXXXXX"
$SiteURL = "XXXXXXXXXXX"
$DocLibName = "Documents"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
$Password = 'XXXXXX' | ConvertTo-SecureString -AsPlainText -Force
#Bind to site collection
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($User,$Password)
$Context.Credentials = $Creds
Retrieve list
$List = $Context.Web.Lists.GetByTitle($DocLibName)
$Context.Load($List)
$Context.ExecuteQuery()
#Upload File
$Upload = $List.RootFolder.Files.Add('abc.pdf',$ByteArray,$true)
$Context.Load($Upload)
$Context.ExecuteQuery()
Add doesn't work and not sure how to upload a byte array. I have tried with different arguments.
Error is
Cannot find an overload for "Add" and the argument count: "3".
Any help?
Jan 29 2017 10:35 PM
i think it can not find your library but not sure are you using the default documents library?(aka Shared Documents)?
Jan 29 2017 11:08 PM
Check the below sample.
https://gist.github.com/asadrefai/ecfb32db81acaa80282d
The number of arguments for the Add is 1, also I think can't add the byte stream in one go.
Jan 29 2017 11:23 PM
Jan 30 2017 12:39 AM
You mean a local file to SharePoint or just a basic file to another folder local?
Jan 30 2017 01:32 AM
Jan 30 2017 03:12 AM
Instead of the 3 parameters you are currently passing you have to provide a single parameter of type FileCreationInformation to List.RootFolder.Files.Add
More Info:
https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.client.filecreationinformation.aspx
Jan 30 2017 03:20 AM
Jan 30 2017 07:31 AM
The FileCreationInformation object that you need to pass contains a property "Content" to which you can assign this Byte[] (which you already have right?)
Jan 30 2017 09:05 PM
SolutionPlease check the below modified script, which generates the byte array from the given URL and upload it to the SPO.
$wc = New-Object System.Net.WebClient # update with correct path $ByteArray = $wc.downloaddata("http://downloads.microsoft.com/download/file.exe") #Specify tenant admin and site URL and including DLL $User = "XXXXX@XXXXXXX" $Password = 'XXXXXX' | ConvertTo-SecureString -AsPlainText -Force $SiteURL = "XXXXXXXXXXX" $DocLibName = "Documents" Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll" Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll" #Bind to site collection $Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL) $Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($User,$Password) $Context.Credentials = $Creds $List = $Context.Web.Lists.GetByTitle($DocLibName) $Context.Load($List) $Context.ExecuteQuery() #Upload File $s =[System.IO.MemoryStream]($ByteArray) $FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation $FileCreationInfo.Overwrite = $true $FileCreationInfo.ContentStream = $s $FileCreationInfo.URL = $UniqueFileName $Upload = $List.RootFolder.Files.Add($FileCreationInfo) $Context.Load($Upload) $Context.ExecuteQuery()
Jan 30 2017 11:00 PM
Jan 31 2017 06:43 PM
Dec 06 2017 06:42 PM