0
votes

I am using this code from Upload File to Google-drive Teamdrive folder with PyDrive from David Lloyd response, but after running his code I am unable to change the mimeType to image/jpg. I have tried add in my code like so:

parent_folder_id = 'YYYY'

f = drive.CreateFile({
    'title': 'image.jpg', 'mimeType': 'image/jpg'
    'parents': [{
        'kind': 'drive#fileLink',
        'teamDriveId': team_drive_id,
        'id': parent_folder_id
    }]
})
f.SetContentString("path/image.jpg")

f.Upload(param={'supportsTeamDrives': True})

# where XXXX and YYYY are the team drive and target folder ids found from the end of the URLS when you open them in your browser.

but the image uploads as a PDF file in Google Drive.

2
Have you considered using the official Drive API Client for Python provided by Google?alberto vielma
I tried using, but couldn't make it work using the official(I am new to GoogleApi and programming, so to code in the API learned through PyDrive because I found easier to code in it). But what I am frustrated is that this mimetype works when uploading to My Drive but not to the Shared Folder.Helena
I have changed the mimeType to image/jpeg. It appears as a image in google drive, but it doesn't give me a preview and when I download it says the file is damage. Any idea of may have caused this?Helena

2 Answers

1
votes

I will give you this solution, which uses the Python Client Library for Drive and modifying one part of the Drive Python Quickstart's code. I was able to upload an image into a Shared Drive in a specific folder and also changing the mimeType from png to jpg.

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from apiclient.http import MediaFileUpload

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive']

def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('drive', 'v3', credentials=creds)
    # This is all the metadata for the file
    file_metadata = {
        "name": "testupload.jpg",
        # My shared Drive id
        "driveId": "you-shared-drive-id",
        "parents": [
            #Folder where the file will be saved
            "folder-id"
        ]
    }
    # This is all the file's data
    media = MediaFileUpload('testupload.png', mimetype='image/jpg')
    # This is all the file's data 
    file_upload = service.files().create(
        supportsAllDrives=True,
        supportsTeamDrives=True,
        body=file_metadata,
        media_body=media
    ).execute()

    print(file_upload)

if __name__ == '__main__':
    main()


0
votes

If you change the SetContentString() to SetContentFile() it works to upload images to Team Drives. So the code would look like this:

parent_folder_id = 'YYYY'

f = drive.CreateFile({
    'title': 'image.jpg', 'mimeType': 'image/jpg'
    'parents': [{
        'kind': 'drive#fileLink',
        'teamDriveId': team_drive_id,
        'id': parent_folder_id
    }]
})
f.SetContentFile("path/image.jpg")

f.Upload(param={'supportsTeamDrives': True})

# where XXXX and YYYY are the team drive and target folder ids found from the end of the URLS when you open them in your browser.