Configuring File Upload Components
File and Image Upload Widgets Documentation
We have two widgets, FormFilePicker
and FormImagePicker
, that provide user-friendly interfaces for uploading files and images.
The code for these widgets can be found in the frontend/src/components
directory.
Example: Using FormImagePicker in Profile Page with Formik
Here’s an example of how FormImagePicker is utilized on the profile page for avatar upload, integrated with Formik:
import FormImagePicker from '../components/FormImagePicker';
...
<Formik
enableReinitialize
initialValues={initialValues}
onSubmit={(values) => handleSubmit(values)}
>
<Form>
...
<Field
label='Avatar'
color='info'
icon={mdiUpload}
path={'users/avatar'}
name='avatar'
id='avatar'
schema={{
size: undefined,
formats: undefined,
}}
component={FormImagePicker}
></Field>
...
</Form>
</Formik>
FormFilePicker Component
The FormFilePicker component uses several upload services located in the frontend/src/components/Uploaders
directory:
- FilesUploader
- ImagesUploader
- UploadService
UploadService Class
The UploadService class is the core class containing functions such as validate
, upload
, and uploadToServer
, which handle file validation and the uploading process to the server.
Backend File Upload Services
The functionality for uploading, downloading, deleting files either locally or to Google Cloud (GCloud) is implemented in the backend/src/services/file.js
file.
Functions for GCloud / local Operations
- uploadLocal: Uploads a file locally.
- downloadLocal: Downloads a file locally.
- initGCloud: Initializes Google Cloud.
- deleteGCloud: Deletes a file from the cloud.
- uploadGCloud: Uploads a file to the cloud.
- downloadGCloud: Downloads a file from the cloud.
File Routes
The routes for file interactions are defined in backend/src/routes/file.js
. This file also determines which storage type (local or GCloud) will be used based on the environment.
If the project is running locally, the local storage will be used; if in production, GCloud will be used.
Defining File Routes
An example of how our application sets the path for /api/file
in backend/src/index.js
const fileRoutes = require('./routes/file');
...
app.use('/api/file', fileRoutes);
...
Here is how the /download
route in backend/src/routes/file.js
is set:
router.get('/download', (req, res) => {
if (process.env.NODE_ENV == 'production') {
services.downloadGCloud(req, res);
} else {
services.downloadLocal(req, res);
}
});
Configuration Variables
The backend/src/routes/file.js
file uses the following variables from the configuration file backend/src/config.js
:
- uploadDir: Path to the local directory for file interactions.
- gcloud.hash: Your GCloud storage key.
- config.gcloud.bucket: Name of the GCloud storage bucket where files will be stored.