# Installation
# rails active_storage:install
# rails db:migrate
# config/storage.yml
local:
package com.example.demo.controller;
import com.example.demo.dto.FileMetadata;
import com.example.demo.service.FileStorageService;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
<%= form_with model: @document, data: { controller: "upload" } do |form| %>
<div class="field">
<%= form.label :file, "Attach a document" %>
<%= form.file_field :file,
direct_upload: true,
data: { upload_target: "input" } %>
export interface UploadHandle {
promise: Promise<{ status: number; body: string }>;
xhr: XMLHttpRequest;
}
export function uploadFile(
import { useState, useRef } from 'react'
import { DirectUpload } from '@rails/activestorage'
interface ImageUploadProps {
onUploadComplete: (blobId: string) => void
maxSize?: number
const Busboy = require('busboy');
const { storeFile } = require('./storage');
function parseMultipart(req, { maxFileSize = 20 * 1024 * 1024 } = {}) {
return new Promise((resolve, reject) => {
const busboy = Busboy({
const sharp = require('sharp');
const DEFAULTS = {
maxWidth: 1600,
maxHeight: 1600,
format: 'webp',
import sharp from 'sharp';
export interface Variant {
name: string;
width: number;
quality: number;
<?php
namespace App\Dto;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
import magic
from django import forms
from django.core.exceptions import ValidationError
from django.template.defaultfilters import filesizeformat
import os
import uuid
from flask import Blueprint, current_app, jsonify, request
from werkzeug.exceptions import RequestEntityTooLarge
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;