The media type for "file.pdf" cannot be detected

Im trying to upload files and update a page via frontend but I continue getting the message “The media type for “file.pdf” cannot be detected”, ¿what am I doing wrong?



return function ($kirby, $page) {

  $alerts  = [];
  $success = -1;

  if ($kirby->request()->is('POST') === true && get('upload')) {
    $success = 0;
    $pdf = $kirby->request()->files()->get('pdf');
    $xml = $kirby->request()->files()->get('xml');

    try {
        $pdfFile = $page->createFile([
            'source'   => $pdf['tmp_name'],
            'filename' => crc32($pdf['name'].microtime()). '_' . $pdf['name'],
            'template' => 'invoice',
            'content' => [
                'date' => date('d/m/Y h:m')
        $xmlFile = $page->createFile([
            'source'   => $xml['tmp_name'],
            'filename' => crc32($xml['name'].microtime()). '_' . $xml['name'],
            'template' => 'invoice',
            'content' => [
                'date' => date('d/m/Y h:m')
        //Upload de 'history' structure field
        $history = $page->history()->yaml();
        array_unshift($history, [
            'pdf' => $pdfFile,
            'xml' => $xmlFile
        $history = yaml::encode($history);
        $page->update(array('history' => $history));
        $success = 1;
    } catch (Exception $e) {
      $alerts['error'] = $e->getMessage();

  return [
    'alerts' => $alerts,
    'success' => $success


<form action="<?= $page->url() ?>" method="POST" enctype="multipart/form-data">
    <label for="pdf">PDF</label>
    <input type="file" name="pdf" id="pdf" accept="application/pdf" required>

    <label for="xml">XML</label>
    <input type="file" name="xml" id="xml" accept="text/xml" required>
    <input type="submit" name="upload" value="Enviar">

I guess you need allow PDF file type from page blueprint:

I just add in my page blueprint

  accept: text/xml, application/pdf

But still not working

I couldn’t understand exactly where in the blueprint you are using it. You should add to file template blueprint.

# /site/blueprints/files/invoice.yml

title: Invoice

  mime: text/xml, application/pdf

It can help to define mime types in htaccess. Im afraid i dont know the equivalent in Nginx.

These rules are a good start…

I put the wrong piece, but my files/invoice.yml looks similar

title: Invoice

  mime: text/xml, application/pdf
  maxsize: 3000000

I tried to do it without the template but without success.

So, can you upload a PDF file from the panel?

Yes, from the panel I uploaded the pdf and xml without problems

With the same file template?

I’m trying to do it without the file template and I get the same error

The page where I try to create the files looks like this

title: Solicitud
preset: page
pages: false
    label: Estatus
    type: select
    width: 1/4
    default: pending
      pending: Pendiente
      resolved: Enviado
      rejected: Rechazada
    label: Fecha
    type: date
    width: 1/4
    default: today
    label: Historial
    type: structure
        label: Enviado
        type: date
        default: today
        width: 1/4
        label: PDF
        type: files
        max: 1
        width: 1/4
        label: XML
        type: files
        max: 1
        width: 1/4
        label: Comentarios
        type: text
    label: Razón social
    type: text
    width: 1/3
    label: RFC
    type: text
    width: 1/3
    label: Correo del cliente
    type: email
    width: 1/3

Have you tried with different pdf files?

Yes, and all of them show the same error

This is the full error log, seems like it does not matter the file type, mime type is always missing


Kirby\Exception\InvalidArgumentException: The media type for "1526628088_factura2.xml" cannot be detected in C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\FileRules.php:186 Stack trace: #0 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\FileRules.php(62): Kirby\Cms\FileRules::validMime(Object(Kirby\Cms\File), '') #1 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\FileActions.php(114): Kirby\Cms\FileRules::create(Object(Kirby\Cms\File), Object(Kirby\Image\Image)) #2 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\FileActions.php(203): Kirby\Cms\File->commit('create', Array, Object(Closure)) #3 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\HasFiles.php(67): Kirby\Cms\File::create(Array) #4 C:\MAMP\htdocs\loyalplanet-facturas\site\controllers\request.php(21): Kirby\Cms\Page->createFile(Array) #5 [internal function]: Kirby\Cms\App->{closure}(Object(Kirby\Cms\App), Object(Kirby\Cms\Page)) #6 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Toolkit\Controller.php(49): Closure->call(Object(Kirby\Cms\App), Object(Kirby\Cms\App), Object(Kirby\Cms\Page)) #7 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\App.php(375): Kirby\Toolkit\Controller->call(Object(Kirby\Cms\App), Array) #8 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\Page.php(347): Kirby\Cms\App->controller('request', Array, 'html') #9 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\Page.php(1153): Kirby\Cms\Page->controller(Array, 'html') #10 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\App.php(597): Kirby\Cms\Page->render() #11 C:\MAMP\htdocs\loyalplanet-facturas\kirby\src\Cms\App.php(925): Kirby\Cms\App->io(Object(Kirby\Cms\Page)) #12 C:\MAMP\htdocs\loyalplanet-facturas\index.php(5): Kirby\Cms\App->render() #13 {main}


185   if (empty($mime)) {
186     throw new InvalidArgumentException([
187        'key'  => 'file.mime.missing',
188        'data' => ['filename' => $file->filename()]
189     ]);
190   }

Are you testing this locally or on a remote server?

Which exacty Kirby version are you using? Which PHP version? If locally, what setup?

Kirby 3.3.6
PHP 7.4.1
Server: Apache/2.2.31 (Win32)
Windows 10 x64

That’s an outdated version. Please try with the current version.

Using the latest version is the best solution, I just checked and the problem seems to be fixed in 3.5. Thank you all for your support.
If anyone is having the same issue and cannot update his version, it can works changing line 62 in kirby\src\Cms\FileRules.php

62  static::validMime($file, $upload->mime());


62  static::validMime($file, $upload->mime() ?? $file->mime());