Upload media to Supabase from remote URL with nodejs
Introduction
Recently I had to upload images in bulk to Supabase but I was kind of rusty on my nodejs and lost some time so I thought I would share the simple result to spare time for others.
Supabase setup
The first step is to create your bucket on supabase, make it public or make sure to create policies to have the right access.
You can also get your service_role API key to bypass any RLS policies at this URL (do not share or display in public): https://app.supabase.com/project/{YOUR_PROJECT_ID}/settings/api
Script setup
To init your project we are going to need npm or yarn and run those two commands
npm init
npm install @supabase/supabase-js node-fetch@2
It will create a package.json and install the necessary dependencies. Now you can create your script.js file and run
node script.js
If you wish to use typescript you can also do
npx ts-node script.ts
Script
import fetch from 'node-fetch'
import { createClient } from '@supabase/supabase-js'
const script = async () => {
const options = {
schema: 'public',
autoRefreshToken: true,
persistSession: true,
detectSessionInUrl: false,
}
const supabase = createClient(
`https://${process.env.SUPABASE_PROJECT_ID}.supabase.co`,
process.env.SUPABASE_API_KEY || '',
options,
)
const url = 'https://www.grapheine.com/wp-content/uploads/2015/09/nouveau-logo-google-2015.jpg'
const blob = await fetch(url).then((r) => r.blob())
await supabase.storage.from('my-new-bucket').upload('my-name' + '.jpg', blob)
const { publicURL } = supabase.storage.from('covers').getPublicUrl('my-name' + '.jpg')
//To save it in your DB
await supabase.from('myTable').update({ logo_url: publicURL }).eq('id', the_thing_id)
}
script()
That's it, now you can run the script and loop it for bulk upload.