我在下面使用PowerShell将文件上传到onedrive。 http://www.powershellmagazine.com/2014/04/07/using-the-windows-live-apis-from-powershell/
Invoke-RestMethod -Uri $Uri -Method Put -InFile $Path
其中是文件的完整路径
$Path= "C:\SkyDrive/ServerBackups/Webs/Webs/test.txt"
和
$Uri = "https://login.live.com/oauth20_desktop.srf?code=XXXXXX
抛出(404)未找到错误。
答案 0 :(得分:1)
Invoke-RestMethod
中使用的$ Uri的值是错误的。您在脚本中使用的OAuth端点用于身份验证,而不是OneDrive操作。
关于如何将文件上传到OneDrive,这可以分为三个部分。
创建OneDrive应用程序后,如果应用程序是Web类型,您可以获得应用程序ID ,密钥和重定向Uri 。然后使用下面的脚本和三个值。
# get authorize code
Function Get-AuthroizeCode
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][String]$ClientId,
[Parameter(Mandatory=$true)][String]$RedirectURI
)
# the login url
$loginUrl = "https://login.live.com/oauth20_authorize.srf?client_id=$ClientId&scope=onedrive.readwrite offline_access&response_type=code&redirect_uri=$RedirectURI";
# open ie to do authentication
$ie = New-Object -ComObject "InternetExplorer.Application"
$ie.Navigate2($loginUrl) | Out-Null
$ie.Visible = $True
While($ie.Busy -Or -Not $ie.LocationURL.StartsWith($RedirectURI)) {
Start-Sleep -Milliseconds 500
}
# get authorizeCode
$authorizeCode = $ie.LocationURL.SubString($ie.LocationURL.IndexOf("=") + 1).Trim();
$ie.Quit() | Out-Null
RETURN $authorizeCode
}
# get access token and refresh token
Function New-AccessTokenAndRefreshToken
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][String]$ClientId,
[Parameter(Mandatory=$true)][String]$RedirectURI,
[Parameter(Mandatory=$true)][String]$SecrectKey
)
# get authorize code firstly
$AuthorizeCode = Get-AuthroizeCode -ClientId $ClientId -RedirectURI $RedirectURI
$redeemURI = "https://login.live.com/oauth20_token.srf"
$header = @{"Content-Type"="application/x-www-form-urlencoded"}
$postBody = "client_id=$ClientId&redirect_uri=$RedirectURI&client_secret=$SecrectKey&code=$AuthorizeCode&grant_type=authorization_code"
$response = Invoke-RestMethod -Headers $header -Method Post -Uri $redeemURI -Body $postBody
$AccessRefreshToken = New-Object PSObject
$AccessRefreshToken | Add-Member -Type NoteProperty -Name AccessToken -Value $response.access_token
$AccessRefreshToken | Add-Member -Type NoteProperty -Name RefreshToken -Value $response.refresh_token
RETURN $AccessRefreshToken
}
然后,您获得了有效的访问令牌,您可以为Invoke-RestMethod
# get autheticate header
Function Get-AuthenticateHeader
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][String]$AccessToken
)
RETURN @{"Authorization" = "bearer $AccessToken"}
}
最后,您可以使用upload rest api将标题传递给Invoke-RestMethod
。
您可以拨打四种不同的OneDrive上传休息Api。
如果你的目标文件不是太大,意味着文件的长度在100MB以内,我强烈建议你使用Simple item upload。
对于大文件,通常会调用Resumable item upload API
这是一个大故事,您可以直接参考此upload file to OneDrive sample获取完整的脚本。
希望你能摆脱这个问题。
答案 1 :(得分:0)
您无法将文件投放到OAuth端点...对所引用文章的快速扫描表明您应该使用看起来更像$ wlApiUri的$ Uri值。有关此类操作的URL方案的说明,请参阅http://msdn.microsoft.com/en-US/library/dn659726.aspx。