PHP : envoi de fichier

Auteur·rice

Dépassement de taille :

Voir documentation : http://php.net/manual/en/features.file-upload.errors.php

  • si la taille du fichier envoyé dépasse upload_max_filesize, la variable $_FILES contiendra, entre autres choses, l’erreur rencontrée.
  • si le formulaire complet (y compris le fichier) dépasse la configuration post_max_size, le formulaire ne sera pas transmis à PHP. Cela veut dire que $_POST et $_FILES seront vides. Pour détecter ce cas, une solution peut être, comme évoqué ici, de vérifier que $_POST est vide, mais que $_SERVER['CONTENT_LENGTH'] a une valeur supérieure à 0.

Fonctions utiles

Quelques fonctions utilitaires liées à l’envoi de fichier via un formulaire avec <input type="file">.

public static function getFileUploadMaxSize() {
    $upload_max_filesize = ini_get('upload_max_filesize');
    $upload_max_filesize_bytes = self::sizeStringToByte($upload_max_filesize);

    $post_max_size = ini_get('post_max_size');
    $post_max_size_bytes = self::sizeStringToByte($post_max_size);

    if($upload_max_filesize_bytes < $post_max_size_bytes) {
        return $upload_max_filesize;
    } else {
        return $post_max_size;
    }
}

public static function sizeStringToByte($string) {
    $size = (float)mb_substr($string, 0, -1);
    $unit = mb_strtolower(mb_substr($string, -1));

    return (int)round($size * pow(1024, strpos('bkmgtpezy', $unit)));
}

public static function sizeByteToString($bytes) {
    $units = 'bkmgtpezy';
    $value = $bytes;
    while ($value > 1024 && $unit_rank < 8) {
        $value / 1024;
        $unit_rank++;
    }

    return round($value, 2).$units[$unit_rank]);
}