-
-
Save ConnorGriffin/dc804357bb10ff7522d0e21ddfdf9398 to your computer and use it in GitHub Desktop.
# Set the Google Auth parameters. Fill in your RefreshToken, ClientID, and ClientSecret | |
$params = @{ | |
Uri = 'https://accounts.google.com/o/oauth2/token' | |
Body = @( | |
"refresh_token=$RefreshToken", # Replace $RefreshToken with your refresh token | |
"client_id=$ClientID", # Replace $ClientID with your client ID | |
"client_secret=$ClientSecret", # Replace $ClientSecret with your client secret | |
"grant_type=refresh_token" | |
) -join '&' | |
Method = 'Post' | |
ContentType = 'application/x-www-form-urlencoded' | |
} | |
$accessToken = (Invoke-RestMethod @params).access_token | |
# Change this to the file you want to upload | |
$SourceFile = 'C:\Path\To\File' | |
# Get the source file contents and details, encode in base64 | |
$sourceItem = Get-Item $sourceFile | |
$sourceBase64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes($sourceItem.FullName)) | |
$sourceMime = [System.Web.MimeMapping]::GetMimeMapping($sourceItem.FullName) | |
# If uploading to a Team Drive, set this to 'true' | |
$supportsTeamDrives = 'false' | |
# Set the file metadata | |
$uploadMetadata = @{ | |
originalFilename = $sourceItem.Name | |
name = $sourceItem.Name | |
description = $sourceItem.VersionInfo.FileDescription | |
#parents = @('teamDriveid or folderId') # Include to upload to a specific folder | |
#teamDriveId = ‘teamDriveId’ # Include to upload to a specific teamdrive | |
} | |
# Set the upload body | |
$uploadBody = @" | |
--boundary | |
Content-Type: application/json; charset=UTF-8 | |
$($uploadMetadata | ConvertTo-Json) | |
--boundary | |
Content-Transfer-Encoding: base64 | |
Content-Type: $sourceMime | |
$sourceBase64 | |
--boundary-- | |
"@ | |
# Set the upload headers | |
$uploadHeaders = @{ | |
"Authorization" = "Bearer $accessToken" | |
"Content-Type" = 'multipart/related; boundary=boundary' | |
"Content-Length" = $uploadBody.Length | |
} | |
# Perform the upload | |
$response = Invoke-RestMethod -Uri "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsTeamDrives=$supportsTeamDrives" -Method Post -Headers $uploadHeaders -Body $uploadBody |
Hello,
Faced the problem uploading large file >2g
The error information returned by PowerShell is: 'Exception calling "ToBase64String" with "1" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown
as i understand problem caused by using 'ReadAllBytes'
Thanks a lot)
with small files this code works well
Hi there! I know it's been a really long time you've posted this but I'm having trouble where I get the error
"Invoke-RestMethod: C:\Users****\UpTest.ps1:13 (#user blurred for privacy and i dont think it's relevant)
Line |
13 | $accessToken = (Invoke-RestMethod @params).access_token
| ~~~~~~~~~~~~~~~~~~~~~~~~~
| { "error": "invalid_request", "error_description": "Missing required parameter: refresh_token" }"
is this because I'm missing a specific powershell/vcs plugin? I'm also having trouble with the "MimeMapping" but I'm sure I can figure that out.
I hope you are well and thanks for taking the time to write this script!
Hello, i noticed the same thing. When you are in your shared folder, you need to take the ID in the end of the URL https://drive.google.com/drive/folders/1GeOflixv5rTkMUnwMmcD and paste it here:
$uploadMetadata = @{
originalFilename = $sourceItem.Name
name = $sourceItem.Name
description = $sourceItem.VersionInfo.FileDescription
parents = @(1GeOflixv5rTkMUnwMmcD) #the id which is in the end of the url
}