File Uploads

Novaxjs2 supports robust file uploads with automatic multipart form data parsing, configurable size limits, type restrictions, and comprehensive file management capabilities.

Basic File Upload

Create an HTML form with file input and handle the upload in your route:

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="myFile" multiple>
  <button type="submit">Upload</button>
</form>
app.post('/upload', (req, res) => {
  const file = req.files.myFile;
  console.log('Uploaded file:', file);
  
  // File properties available:
  // file.originalname - Original filename
  // file.size - File size in bytes
  // file.path - Path to stored file
  // file.mimetype - MIME type of the file
  
  res.json({ 
    message: 'File uploaded successfully',
    filename: file.originalname,
    size: file.size
  });
});

Multiple File Uploads

Handle multiple files in a single request:

app.post('/upload-multiple', (req, res) => {
  const files = req.files; // Object containing all uploaded files
  
  // Process each file
  const uploadedFiles = [];
  for (const fieldName in files) {
    const fileArray = files[fieldName];
    for (const file of fileArray) {
      uploadedFiles.push({
        field: fieldName,
        name: file.originalname,
        size: file.size,
        type: file.mimetype
      });
    }
  }
  
  return {
    message: `${uploadedFiles.length} files uploaded successfully`,
    files: uploadedFiles
  };
});

Configuration

Configure file upload limits and restrictions:

// Set file size limit (default: 50MB)
app.setFileSizeLimit(10); // 10MB limit

// Set allowed file types
app.setAllowedFileTypes(['image/jpeg', 'image/png', 'application/pdf']);

// Set maximum number of files per upload
app.setMaxFiles(5);

// Keep original filenames
app.setKeepOriginalName(true);

Error Handling

Handle file upload errors gracefully:

app.error((err, req, res) => {
  if (err.code === 'LIMIT_FILE_SIZE') {
    return 'File is too large! Maximum size is 10MB';
  }
  if (err.code === 'LIMIT_FILE_TYPE') {
    return 'File type not allowed. Please upload JPEG, PNG, or PDF files only.';
  }
  if (err.code === 'LIMIT_FILE_COUNT') {
    return 'Too many files uploaded. Maximum is 5 files per request.';
  }
  return 'An error occurred during file upload';
});

File Management

Use the file handler for advanced file operations:

// Clear all uploaded files
app.fileHandler.clearUploads();

// Remove specific file
app.fileHandler.removeFile('/path/to/file');

// Get readable stream of a file
const stream = app.fileHandler.getFileStream('/path/to/file');
stream.pipe(res);

// Check file handler configuration
console.log('Max file size:', app.fileHandler.maxFileSize);
console.log('Allowed types:', app.fileHandler.allowedTypes);

Complete Example

const Nova = require('novaxjs2');
const app = new Nova();

// Configure file uploads
app.setFileConfig({
  maxSize: 10,
  allowedTypes: ['image/jpeg', 'image/png', 'application/pdf'],
  maxFiles: 5,
  keepOriginalName: true
});

// Upload route
app.post('/upload', (req, res) => {
  if (!req.files || Object.keys(req.files).length === 0) {
    return { error: 'No files were uploaded' };
  }
  
  const files = req.files;
  const results = [];
  
  // Process each file
  for (const fieldName in files) {
    const fileArray = Array.isArray(files[fieldName]) ? 
      files[fieldName] : [files[fieldName]];
    
    for (const file of fileArray) {
      results.push({
        field: fieldName,
        filename: file.originalname,
        size: file.size,
        mimetype: file.mimetype,
        path: file.path
      });
    }
  }
  
  return {
    message: 'Upload successful',
    count: results.length,
    files: results
  };
});

// Error handling
app.error((err, req, res) => {
  if (err.code === 'LIMIT_FILE_SIZE') {
    return { error: 'File too large', maxSize: '10MB' };
  }
  if (err.code === 'LIMIT_FILE_TYPE') {
    return { error: 'Invalid file type', allowedTypes: ['JPEG', 'PNG', 'PDF'] };
  }
  return { error: 'Upload failed', details: err.message };
});

app.at(3000, () => {
  console.log('Server running on port 3000 with file upload support');
});