Skip Navigation
Docs

File Upload

The File Upload allows your user to upload files like images, PDF documents, or archives with a form submission.

Clicking on the Edit button, you can customize the maximum file size and the allowed document types.

PHP has a maximum file size in the php.ini config that will take preference over the specified file size in the fields config. To increase it, set the upload_max_filesize & post_max_size to your desired values.

It's important to keep in mind that the file upload is not available when disabling storing submisisons.

Protecting files

Since Kirby copies all files to the media folder, they're publicly accessible by default. If you're handling sensitive data, follow along. The Kirby documentation has great Cookbook guide on how to protect files. You can adapt it to work with DreamForm files by checking for the dreamform-upload blueprint. In the end, it could look lke this:

<?php

use Kirby\Toolkit\Str;
use Kirby\Uuid\Uuid;
use Kirby\Cms\App;

App::plugin('dreamform/files-firewall', [
  'routes' => [
    [
      'pattern' => '_form/(:any)',
      'action'  => function ($filename) {
        if (
          kirby()->user() &&
          $file = Uuid::for("file://{$filename}")?->model()
        ) {
          /** @var \Kirby\Cms\File $file */
          return $file->download();
        }

        return site()->errorPage();
      },
    ],
  ],
  'components' => [
    'file::url' => function ($kirby, $file) {
      if ($file->template() === 'dreamform-upload') {
        return $kirby->url() . '/_form/' . Str::replace($file->uuid()->toString(), 'file://', '');
      }

      return $file->mediaUrl();
    },
    'file::version' => function ($kirby, $file, array $options = []) {
      static $original;

      // if the file is protected, return the original file
      if ($file->template() === 'dreamform-upload') {
        return $file;
      }

      // if static $original is null, get the original component
      if ($original === null) {
        $original = $kirby->nativeComponent('file::version');
      }

      // and return it with the given options
      return $original($kirby, $file, $options);
    }
  ],
]);