init commit,
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
# Upload files to Storage
|
||||
|
||||
This example shows how to process `multipart/form-data` in an Edge Function. Then, upload files in the request to Supabase Storage and insert other fields as a record to a database table.
|
@@ -0,0 +1,67 @@
|
||||
// This example shows how to use Edge Functions to read incoming multipart/form-data request,
|
||||
// and write files to Supabase Storage and other fields to a database table.
|
||||
|
||||
import { Application } from 'https://deno.land/x/oak@v11.1.0/mod.ts'
|
||||
import { createClient } from 'jsr:@supabase/supabase-js@2'
|
||||
|
||||
const MB = 1024 * 1024
|
||||
|
||||
const app = new Application()
|
||||
|
||||
app.use(async (ctx) => {
|
||||
const body = ctx.request.body({ type: 'form-data' })
|
||||
const formData = await body.value.read({
|
||||
// Need to set the maxSize so files will be stored in memory.
|
||||
// This is necessary as Edge Functions don't have disk write access.
|
||||
// We are setting the max size as 10MB (an Edge Function has a max memory limit of 150MB)
|
||||
// For more config options, check: https://deno.land/x/oak@v11.1.0/mod.ts?s=FormDataReadOptions
|
||||
maxSize: 10 * MB,
|
||||
})
|
||||
if (!formData.files || !formData.files.length) {
|
||||
ctx.response.status = 400
|
||||
ctx.response.body = 'missing file'
|
||||
return
|
||||
}
|
||||
|
||||
const supabaseClient = createClient(
|
||||
// Supabase API URL - env var exported by default.
|
||||
Deno.env.get('SUPABASE_URL')!,
|
||||
// Supabase API ANON KEY - env var exported by default.
|
||||
Deno.env.get('SUPABASE_ANON_KEY')!
|
||||
)
|
||||
|
||||
//upload image to Storage
|
||||
const file = formData.files[0]
|
||||
const timestamp = +new Date()
|
||||
const uploadName = `${file.name}-${timestamp}`
|
||||
const { data: upload, error: uploadError } = await supabaseClient.storage
|
||||
.from('images')
|
||||
.upload(uploadName, file.content!.buffer, {
|
||||
contentType: file.contentType,
|
||||
cacheControl: '3600',
|
||||
upsert: false,
|
||||
})
|
||||
if (uploadError) {
|
||||
console.error(uploadError)
|
||||
ctx.response.status = 500
|
||||
ctx.response.body = 'Failed to upload the file'
|
||||
return
|
||||
}
|
||||
|
||||
// insert record to messages table
|
||||
const { error } = await supabaseClient.from('comments').insert({
|
||||
message: formData.fields!.message || '',
|
||||
image_path: upload.path,
|
||||
})
|
||||
if (error) {
|
||||
console.error(error)
|
||||
ctx.response.status = 500
|
||||
ctx.response.body = 'Fail to add the record'
|
||||
return
|
||||
}
|
||||
|
||||
ctx.response.status = 201
|
||||
ctx.response.body = 'Success!'
|
||||
})
|
||||
|
||||
await app.listen({ port: 8000 })
|
Reference in New Issue
Block a user