File Upload
Handles uploading lesson materials and extracting text content for AI processing. Supports multiple file formats via drag-and-drop, plus direct text paste as a fallback.
Overview
- Upload: Drag-and-drop or click to select files
- Storage: Files stored in Convex file storage via presigned URL pattern
- Parsing: Extract text from various formats in a Convex action with image preservation
- Fallback: Text paste/type for when file upload isn't needed
When to Use This Skill
- Building the file upload UI component
- Implementing file parsing logic
- Setting up Convex file storage
- Handling file type validation and errors
Key Concepts
Supported Formats
| Format | Extension | Parsing Library | Notes |
|---|---|---|---|
pdf-parse |
Text extraction | ||
| Word | .docx | mammoth |
HTML + images as base64 |
| PowerPoint | .pptx | jszip |
XML text extraction |
| OpenDocument | .odt | officeparser |
Full AST parsing |
| HTML | .html, .htm | Built-in | Sanitized, scripts removed |
| Markdown | .md | Built-in | Converted to HTML |
| Plain text | .txt | N/A | Direct read |
| RTF | .rtf | Built-in | Formatting stripped |
Upload Flow (Convex 3-Step Pattern)
- Client calls
generateUploadUrlmutation → gets short-lived presigned URL - Client POSTs file to that URL with
Content-Typeheader → gets{ storageId }in response - Client passes
storageIdto a Convex action for parsing, or stores it in a document
From Convex docs: ctx.storage.generateUploadUrl() returns a Promise<string>. The POST response JSON contains { storageId: Id<"_storage"> }.
File Reading in Actions
ctx.storage.get(storageId)returnsBlob | nullin actionsctx.storage.getUrl(storageId)returnsstring | nullin queries/mutations (public URL)- Use dynamic
import()(notrequire()) for parsing libraries in Convex actions
File Size Limits
- Max file: 10MB (reasonable for lesson materials)
- Client-side validation before upload attempt
Related Files
convex/files.ts— Upload URL generation, file parsing action- Homepage upload component
Reference Files
- reference.md — Upload and parsing code examples