LoginSignup
0
0

SAによるアップロードファイルをユーザへ共有

Last updated at Posted at 2024-06-02

概要

あるアプリを作成中に、サービスアカウントを利用して、google driveへファイルをアップロードし、そのファイルをユーザが閲覧可能な状態にするための実装を行っていました。

python google driveと検索すると、公式では以下の情報が表示されますが、この方法だとブラウザを介することでしか実現できないので、今回は採用していません。

chatGPTに尋ねること数回で完成するので、メモに近いです。

準備

  1. GoogleアカウントでSAを作成(ブラウザ上で何か権限を追加する必要なし)
  2. 対象のプロジェクトにて、Google Drive API有効化
  3. 必要なライブラリインストール
    pip install oauth2client google-api-python-client
    

実装

今回はPDFファイルをアップロードしたかったので、以下のように実装しました。
アップロード先は個人ドライブです。SA経由でアップロードするので、ユーザに権限不要後、共有アイテムから確認可能な形になります。
アップロード先を共有ドライブとする場合は、service.files().createに渡す値をもう少し複雑です。(参考資料

    from oauth2client.service_account import ServiceAccountCredentials
    from googleapiclient.discovery import build
    from googleapiclient.http import MediaFileUpload

    scope = ['https://www.googleapis.com/auth/drive']

    # Parsing JSON credentials for a service account:
    credentials = ServiceAccountCredentials.from_json_keyfile_name('sa.json', scope)
    service = build('drive', 'v3', credentials=credentials)

    # アップロードするファイルのパス
    file_path = 'XXX.pdf'

    # ファイルメタデータを定義
    file_metadata = {
        'name': os.path.basename(file_path),
    }

    # ファイルをアップロード
    media = MediaFileUpload(file_path, mimetype='application/pdf')
    file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
    fileId = file.get('id')
    
    file_url = f'https://drive.google.com/file/d/{fileId}/view'

    # 特定のメールアドレスにアクセス権を付与する関数
    permissions = {
        'type': 'user',
        'role': 'reader',
        'emailAddress': email
    }
    service.permissions().create(fileId=fileId, 
                                 body=permissions, 
                                 ).execute()
    try:
        permissions = service.permissions().list(fileId=fileId).execute()             
    except Exception as e:
        print('An error occurred:', e)
        permissions = service.permissions().list(fileId=fileId).execute()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0