7

could anyone please inform me how to automatically get a shareable link of a file in our google drive using Colab notebook?

Thank you.

Hermawan Wiwid
  • 415
  • 5
  • 14

4 Answers4

11

You can use xattr to get file_id

from subprocess import getoutput
from IPython.display import HTML
from google.colab import drive
drive.mount('/content/drive')  # access drive
# need to install xattr
!apt-get install xattr > /dev/null
# get the id
fid = getoutput("xattr -p 'user.drive.id' '/content/drive/My Drive/Colab Notebooks/R.ipynb' ")
# make a link and display it
HTML(f"<a href=https://colab.research.google.com/drive/{fid} target=_blank>notebook</a>")

Here I access my notebook file at /Colab Notebooks/R.ipynb and make a link to open it in Colab.

korakot
  • 37,818
  • 16
  • 123
  • 144
  • Hmm... this appears to only work for notebook files. But using the url from J.K's approach below (https://drive.google.com/file/d/) seemed to work – Att Righ Feb 21 '22 at 17:32
3

In my case, the suggested solution doesn't work. So I replaced the colab URL with "https://drive.google.com//file/d/"

Below what I used:

def get_shareable_link(file_path):
  fid = getoutput("xattr -p 'user.drive.id' " + "'" + file_path + "'")
  print(fid)
  # make a link and display it
  return HTML(f"<a href=https://drive.google.com/file/d/{fid} target=_blank>file URL</a>")

get_shareable_link("/content/drive/MyDrive/../img_01.jpg")
J.K
  • 1,178
  • 10
  • 13
2

If you look into the documentation you can see a section that explain how to list files from Drive.

Using that and reading the documentation of the library used, I've created this script:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

files = drive.ListFile().GetList()
for file in files:
  keys = file.keys()
  if 'webContentLink' in keys:
    link = file['webContentLink']
  elif 'webViewLink' in keys:
    link = file['webViewLink']
  else:
    link = 'No Link Available. Check your sharing settings.'

  if 'name' in keys:
    name = file['name']
  else:
    name = file['id']

  print('name: {}  link: {}'.format(name, link))

This is currently listing all files and providing a link to it.

You can then edit the function to find a specific file instead.

Hope this helps!

ZektorH
  • 2,680
  • 1
  • 7
  • 20
0

get_output wasn't defined for me in the other answers, but this worked instead, after doing the drive.mount command: (test.zip needs to point to the right folder and file in your Drive!):

!apt-get install -qq xattr
filename = "/content/drive/My\ Drive/test.zip"
# Retrieving the file ID for a file in `"/content/drive/My Drive/"`:
id = !xattr -p 'user.drive.id' {filename}
print(id)
John Targaryen
  • 1,109
  • 1
  • 13
  • 29