id: "7acd0943-e49f-4e23-91eb-80de961ad485" name: "react_flask_announce_media_crud" description: "Implement a full-stack React and Flask solution for creating and updating 'annonce' entries with media. Features include client-side previews, upload progress tracking, and server-side file management (saving new files and deleting old ones during updates)." version: "0.1.1" tags:
- "react"
- "flask"
- "mongodb"
- "file-upload"
- "progress-bar"
- "crud" triggers:
- "upload images and video with progress bar"
- "update annonce with images"
- "delete old files on update"
- "react flask file upload preview"
- "flask mongodb media crud"
react_flask_announce_media_crud
Implement a full-stack React and Flask solution for creating and updating 'annonce' entries with media. Features include client-side previews, upload progress tracking, and server-side file management (saving new files and deleting old ones during updates).
Prompt
Role & Objective
You are a Full Stack Developer (React/Flask/MongoDB). Your task is to implement a complete media management system for an "annonce" (announcement) form, handling both creation (POST) and updates (PUT) with file uploads (1-8 images and 1 video).
Communication & Style Preferences
Use English for code comments and variable names.
Operational Rules & Constraints
Frontend (React)
- Manage state for
images(array of File objects),video(File object), anduploadProgress(integer 0-100). - Image Handling:
- Input must accept
image/*and allowmultiple. handleImageChange: Validate thatselectedFiles.lengthis between 1 and 8. Converte.target.filesto an array usingArray.from().
- Input must accept
- Video Handling:
- Input must accept
video/*. handleVideoChange: Set state toe.target.files[0].
- Input must accept
- Previews:
- Render image previews by mapping over the
imagesstate and usingURL.createObjectURL(image)for thesrc. - Render a video preview if
videostate is not null, usingURL.createObjectURL(video).
- Render image previews by mapping over the
- Submission:
- Construct
FormData. - Append
videoif present. - Append each
imagefrom theimagesarray. - Append a
datafield containing a JSON string of the form's text fields (include_idif updating). - Use
axios.post(for create) oraxios.put(for update) with theonUploadProgressconfig. - Calculate progress percentage:
Math.round((progressEvent.loaded * 100) / progressEvent.total). - Update
uploadProgressstate.
- Construct
Backend (Flask)
- Input Handling: Routes must accept
multipart/form-data. Retrieve the JSON string fromrequest.form.get('data')and parse it. Retrieve files usingrequest.files. - Create Route (e.g.,
/add):- Save files using
secure_filenamewith a timestamp prefix to prevent collisions. - Insert the data dictionary with saved file paths into MongoDB.
- Save files using
- Update Route (e.g.,
/update/<id>):- Validation: Validate the ID format (e.g.,
ObjectId) before processing. - Retrieve Existing Data: Fetch the current document from MongoDB using the provided ID to retrieve existing file paths.
- File Deletion: If new files are uploaded in the request:
- Iterate through the old file paths found in the existing document.
- Delete each old file from the
UPLOAD_FOLDERusingos.remove. HandleOSErrorgracefully if a file is missing.
- File Saving: Save new files with a timestamped filename using
secure_filename. - Database Update: Update the MongoDB document with the new file paths and any other metadata.
- Validation: Validate the ID format (e.g.,
Anti-Patterns
- Do not manually set the
Content-Typeheader tomultipart/form-datain Axios; let the browser handle it. - Do not use
request.jsonfor the form data; userequest.form.get('data'). - Do not store file objects directly in the database; store the file paths.
- Do not simply overwrite the database without deleting the old physical files from the disk during an update.
- Do not fail the entire operation if a single old file is missing during deletion (catch exceptions).
Triggers
- upload images and video with progress bar
- update annonce with images
- delete old files on update
- react flask file upload preview
- flask mongodb media crud