or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

constructor-config.mdevent-system.mdfile-management.mdindex.mdstatic-utilities.mdthumbnails.mdupload-processing.md
tile.json

upload-processing.mddocs/

Upload Processing

Upload queue management, file processing, and upload control functionality for handling file uploads to the server.

Capabilities

Queue Processing

Process the upload queue with configurable parallel uploads and queue management.

/**
 * Process all files in the upload queue
 */
processQueue(): void;

/**
 * Process a single file
 * @param file - File to process
 */
processFile(file: File): void;

/**
 * Process multiple files
 * @param files - Array of files to process
 */
processFiles(files: File[]): void;

Usage Examples:

const dropzone = new Dropzone("#my-dropzone", {
  url: "/upload",
  autoProcessQueue: false, // Manual queue processing
  parallelUploads: 3 // Process up to 3 files simultaneously
});

// Process queue manually
document.getElementById("upload-btn").addEventListener("click", () => {
  dropzone.processQueue();
});

// Process specific files
const selectedFiles = dropzone.getQueuedFiles().slice(0, 2);
dropzone.processFiles(selectedFiles);

// Process single file
dropzone.on("addedfile", function(file) {
  if (file.type.startsWith("image/")) {
    // Process images immediately
    dropzone.processFile(file);
  }
});

Upload Control

Direct upload methods and upload cancellation.

/**
 * Upload a single file
 * @param file - File to upload
 */
uploadFile(file: File): void;

/**
 * Upload multiple files
 * @param files - Array of files to upload
 */
uploadFiles(files: File[]): void;

/**
 * Cancel an ongoing upload
 * @param file - File upload to cancel
 */
cancelUpload(file: File): void;

Usage Examples:

const dropzone = new Dropzone("#my-dropzone", {
  url: "/upload",
  autoProcessQueue: false
});

// Direct upload without queue
dropzone.on("addedfile", function(file) {
  if (file.size < 1024 * 1024) { // Upload small files immediately
    dropzone.uploadFile(file);
  }
});

// Batch upload
const filesToUpload = dropzone.getAcceptedFiles();
dropzone.uploadFiles(filesToUpload);

// Cancel upload functionality
dropzone.on("addedfile", function(file) {
  const cancelBtn = document.createElement("button");
  cancelBtn.innerHTML = "Cancel";
  cancelBtn.onclick = () => dropzone.cancelUpload(file);
  file.previewElement.appendChild(cancelBtn);
});

// Cancel all uploads
function cancelAllUploads() {
  dropzone.getUploadingFiles().forEach(file => {
    dropzone.cancelUpload(file);
  });
}

Upload Configuration

Configure upload behavior and parameters.

interface UploadOptions {
  /** Upload URL */
  url: string;
  /** HTTP method (default: "post") */
  method?: string;
  /** Whether to send credentials with CORS requests */
  withCredentials?: boolean;
  /** Maximum number of parallel uploads */
  parallelUploads?: number;
  /** Whether to send multiple files in one request */
  uploadMultiple?: boolean;
  /** Parameter name for the file */
  paramName?: string;
  /** Additional parameters to send */
  params?: object;
  /** Custom headers for upload requests */
  headers?: object;
  /** Whether to automatically process the queue */
  autoProcessQueue?: boolean;
  /** Timeout for upload requests in milliseconds */
  timeout?: number;
}

Usage Examples:

// Standard upload configuration
const dropzone = new Dropzone("#my-dropzone", {
  url: "/api/upload",
  method: "PUT",
  parallelUploads: 5,
  params: {
    userId: "123",
    category: "documents"
  },
  headers: {
    "Authorization": "Bearer " + token,
    "X-Custom-Header": "value"
  }
});

// Multiple file upload in single request
const multiUploadDropzone = new Dropzone("#multi-upload", {
  url: "/api/batch-upload",
  uploadMultiple: true,
  parallelUploads: 1, // Only one batch at a time
  paramName: "files" // All files under 'files' parameter
});

// Custom parameter names for multiple files
const customParamDropzone = new Dropzone("#custom-params", {
  url: "/upload",
  paramName: function(n) {
    return "file_" + n; // file_0, file_1, etc.
  }
});

Upload Progress Tracking

Monitor upload progress and handle progress events.

/**
 * Update total upload progress across all files
 */
updateTotalUploadProgress(): void;

// Progress tracking through events
on("uploadprogress", (file: File, progress: number, bytesSent: number) => void): void;
on("totaluploadprogress", (totalProgress: number, totalBytes: number, totalBytesSent: number) => void): void;

Usage Examples:

const dropzone = new Dropzone("#my-dropzone", { url: "/upload" });

// Track individual file progress
dropzone.on("uploadprogress", function(file, progress, bytesSent) {
  console.log(`${file.name}: ${Math.round(progress)}% (${bytesSent} bytes sent)`);
  
  // Update progress bar
  const progressBar = file.previewElement.querySelector(".progress-bar");
  if (progressBar) {
    progressBar.style.width = progress + "%";
  }
});

// Track total progress across all files
dropzone.on("totaluploadprogress", function(totalProgress, totalBytes, totalBytesSent) {
  console.log(`Total: ${Math.round(totalProgress)}% (${totalBytesSent}/${totalBytes} bytes)`);
  
  // Update overall progress indicator
  document.getElementById("total-progress").style.width = totalProgress + "%";
});

// Manual progress update
dropzone.updateTotalUploadProgress();

Upload Request Handling

Handle upload requests and responses.

/**
 * Submit the upload request
 * @param xhr - XMLHttpRequest object
 * @param formData - FormData containing files and parameters
 * @param files - Array of files being uploaded
 */
submitRequest(xhr: XMLHttpRequest, formData: FormData, files: File[]): void;

/**
 * Handle successful upload completion
 * @param files - Uploaded files
 * @param responseText - Server response
 * @param e - XMLHttpRequest event
 */
_finished(files: File[], responseText: string, e: Event): void;

/**
 * Handle upload errors
 * @param files - Files that failed
 * @param message - Error message
 * @param xhr - XMLHttpRequest object
 */
_errorProcessing(files: File[], message: string, xhr?: XMLHttpRequest): void;

Usage Examples:

const dropzone = new Dropzone("#my-dropzone", {
  url: "/upload",
  
  // Custom request handling
  init: function() {
    this.on("sending", function(file, xhr, formData) {
      // Modify request before sending
      formData.append("timestamp", Date.now());
      formData.append("fileId", generateUniqueId());
      
      // Custom headers
      xhr.setRequestHeader("X-File-Name", file.name);
    });
    
    this.on("success", function(file, response) {
      console.log("Upload successful:", response);
      // Parse JSON response
      try {
        const data = JSON.parse(response);
        file.serverId = data.id;
        file.serverUrl = data.url;
      } catch (e) {
        console.log("Response is not JSON:", response);
      }
    });
    
    this.on("error", function(file, errorMessage, xhr) {
      console.error("Upload failed:", errorMessage);
      if (xhr) {
        console.error("Status:", xhr.status);
        console.error("Response:", xhr.responseText);
      }
    });
  }
});

// Custom request processing
function customSubmitRequest(xhr, formData, files) {
  // Add authentication
  xhr.setRequestHeader("Authorization", "Bearer " + getAuthToken());
  
  // Add CSRF token
  formData.append("_token", getCsrfToken());
  
  // Custom upload logic
  xhr.upload.addEventListener("progress", function(e) {
    if (e.lengthComputable) {
      const progress = (e.loaded / e.total) * 100;
      console.log("Custom progress:", progress);
    }
  });
}

Upload Queue Management

Advanced queue management and processing control.

/**
 * Get files associated with specific XMLHttpRequest
 * @param xhr - XMLHttpRequest object
 */
_getFilesWithXhr(xhr: XMLHttpRequest): File[];

Usage Examples:

const dropzone = new Dropzone("#my-dropzone", {
  url: "/upload",
  parallelUploads: 2,
  
  init: function() {
    // Custom queue management
    this.on("processing", function(file) {
      console.log("Started processing:", file.name);
      
      // Track processing files
      if (!this.processingFiles) {
        this.processingFiles = new Set();
      }
      this.processingFiles.add(file);
    });
    
    this.on("queuecomplete", function() {
      console.log("All files processed");
      this.processingFiles.clear();
    });
    
    // Handle upload errors with retry logic
    this.on("error", function(file, errorMessage, xhr) {
      if (xhr && xhr.status >= 500) {
        // Server error - retry upload
        setTimeout(() => {
          this.enqueueFile(file);
        }, 5000);
      }
    });
  }
});

// Pause/resume queue processing
function pauseUploads(dropzone) {
  dropzone.autoProcessQueue = false;
  // Cancel current uploads
  dropzone.getUploadingFiles().forEach(file => {
    dropzone.cancelUpload(file);
  });
}

function resumeUploads(dropzone) {
  dropzone.autoProcessQueue = true;
  dropzone.processQueue();
}

Batch Upload Handling

Handle multiple files in single requests.

// Configuration for batch uploads
interface BatchUploadOptions {
  uploadMultiple: true;
  parallelUploads: number; // Number of batches to process simultaneously
  maxFiles?: number; // Total file limit
}

Usage Examples:

// Batch upload configuration
const batchDropzone = new Dropzone("#batch-upload", {
  url: "/api/batch-upload",
  uploadMultiple: true,
  parallelUploads: 1, // One batch at a time
  maxFiles: 20,
  
  init: function() {
    this.on("sendingmultiple", function(files, xhr, formData) {
      console.log("Sending batch of", files.length, "files");
      formData.append("batchId", generateBatchId());
    });
    
    this.on("successmultiple", function(files, response) {
      console.log("Batch upload successful:", response);
      files.forEach((file, index) => {
        file.serverId = response.ids[index];
      });
    });
    
    this.on("errormultiple", function(files, errorMessage) {
      console.error("Batch upload failed:", errorMessage);
      // Handle batch failures
    });
  }
});

// Process files in custom batches
function processBatches(dropzone, batchSize = 5) {
  const queuedFiles = dropzone.getQueuedFiles();
  
  for (let i = 0; i < queuedFiles.length; i += batchSize) {
    const batch = queuedFiles.slice(i, i + batchSize);
    dropzone.processFiles(batch);
  }
}