[resumes][feat] file upload

pull/321/head
Keane Chan 3 years ago
parent 6a58342b38
commit cdd2aa4f07
No known key found for this signature in database
GPG Key ID: 32718398E1E9F87C

@ -34,7 +34,6 @@
"react-pdf": "^5.7.2", "react-pdf": "^5.7.2",
"react-query": "^3.39.2", "react-query": "^3.39.2",
"superjson": "^1.10.0", "superjson": "^1.10.0",
"uuid": "^9.0.0",
"zod": "^3.18.0" "zod": "^3.18.0"
}, },
"devDependencies": { "devDependencies": {
@ -45,7 +44,6 @@
"@types/react": "^18.0.21", "@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6", "@types/react-dom": "^18.0.6",
"@types/react-pdf": "^5.7.2", "@types/react-pdf": "^5.7.2",
"@types/uuid": "^8.3.4",
"autoprefixer": "^10.4.12", "autoprefixer": "^10.4.12",
"postcss": "^8.4.16", "postcss": "^8.4.16",
"prettier-plugin-tailwindcss": "^0.1.13", "prettier-plugin-tailwindcss": "^0.1.13",

@ -1,11 +1,13 @@
import axios from 'axios'; import axios from 'axios';
import { formidable } from 'formidable'; import formidable from 'formidable';
import * as fs from 'fs';
import type { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import { v4 as uuidv4 } from 'uuid';
import { env } from '~/env/server.mjs'; import { env } from '~/env/server.mjs';
import { supabase } from '~/utils/supabase';
const BASE_URL = `${env.SUPABASE_URL}/storage/v1/object`; const BASE_URL = `${env.SUPABASE_URL}/storage/v1/object`;
const BASE_FILE_URL = `${BASE_URL}/public`;
export const config = { export const config = {
api: { api: {
@ -17,33 +19,26 @@ export default async function handler(
req: NextApiRequest, req: NextApiRequest,
res: NextApiResponse, res: NextApiResponse,
) { ) {
const headers = {
'Content-Type': 'multipart/form-data',
apiKey: env.SUPABASE_ANON_KEY,
authorization: 'Bearer ' + env.SUPABASE_ANON_KEY,
};
if (req.method === 'POST') { if (req.method === 'POST') {
try { try {
const form = formidable({ multiples: false }); const form = formidable({ keepExtensions: true });
form.parse(req, async (err, fields, files) => { form.parse(req, async (err, fields, files) => {
if (err) { if (err) {
throw err; throw err;
} }
const { file } = files;
const actualFile = file instanceof Array ? file[0] : file;
const filePath = `${uuidv4()}-${actualFile.originalFilename}`;
const { key } = fields; const { key } = fields;
const { file } = files;
const parsedFile: formidable.File =
file instanceof Array ? file[0] : file;
const filePath = `${Date.now()}-${parsedFile.originalFilename}`;
const convertedFile = fs.readFileSync(parsedFile.filepath);
supabase.storage.from(key as string).upload(filePath, convertedFile);
const data = await axios.post(
`${BASE_URL}/${key}/${filePath}`,
actualFile,
{
headers,
},
);
return res.status(200).json({ return res.status(200).json({
url: data.data.key, url: `${BASE_FILE_URL}/${key}/${filePath}`,
}); });
}); });
} catch (error: unknown) { } catch (error: unknown) {

@ -71,7 +71,7 @@ export default function SubmitResumeForm() {
...data, ...data,
url, url,
}); });
// Router.push('/resumes'); router.push('/resumes');
reset(); reset();
}; };

@ -0,0 +1,9 @@
import { createClient } from '@supabase/supabase-js';
import { env } from '~/env/server.mjs';
const { SUPABASE_URL } = env;
const { SUPABASE_ANON_KEY } = env;
// Create a single supabase client for interacting with your database
export const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
Loading…
Cancel
Save