下面我将使用powershell将文件上传到一个驱动器。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)未找到错误。
Invoke-RestMethod
中使用的$Uri值错误。您在脚本中使用的OAuth终结点用于身份验证,而不是OneDrive操作。
关于如何将文件上传到OneDrive,这可以分为三部分。
- 为OAuth身份验证过程注册OneDrive应用程序
- 调用OneDrive身份验证API获取访问令牌
- 使用访问令牌调用OneDrive API以便上载文件
创建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你可以调用。
- 简单项目上传
- 可恢复项目上传
- 多部分项目上传
- 从Url上载
如果你的目标文件不是太大,意味着文件的长度在100MB以内,我强烈建议使用简单项目上传。
对于大文件,通常调用可恢复项目上传API
这是一个大故事,你可以直接参考这个上传文件到OneDrive的示例来获得完整的脚本。
希望你能解决这个问题。
您不能将文件放入OAuth端点。。。快速扫描引用的文章表明,您应该使用看起来更像$wlApiUri的$Uri值。看见http://msdn.microsoft.com/en-US/library/dn659726.aspx用于描述这种操作的URL方案。