Script PHP upload vidéo

Présentation :

Voici un script PHP permettant de lancer une pop up d’upload suite à un submit sur un formulaire.

Après quelques vérification sur la conformité de la requête : la requête post a bien été réalisée via le lien dans une page du site et la chaine de caractère ne contient de javascript malicieux, l’upload est lancé.

Voir les commentaires dans le script pour avoir la signification des instructions :

Fichier telecharger.php

<?php
session_start();

// vérification que la globale contient une chaine && protection contre les attaques CSRF
if (!empty($_POST['nom']) && $_POST['token'] == $_SESSION['token']) { 

// éviter les injections XSS en ajax
    $name = htmlentities($_POST['nom']);

// liste de caractères non alphanumériques présents dans un nom de fichier vidéo : 
// par exemple toto_1.mp4, new-film.avi etc

    $whitelist = array('.','_','-');

// filtrage (temporaire) de $name : supprimer tous les caractères non alphanumériques
    $name_clear = str_replace($whitelist,'',$name);

// test que $name_clear ne contient que des chiffres et des lettres
    if(ctype_alnum($name_clear)){

// Le temps maximal d'exécution, s'il vaut 0, aucune limite n'est imposée
        set_time_limit(0);

        $filename = '/absolute/path/to/the/file/'.$name;
        $size = filesize($filename);

// désactive la mise en cache du navigateur
        header("Cache-Control: no-cache, must-revalidate");
        header("Cache-Control: post-check=0,pre-check=0");
        header("Cache-Control: max-age=0");
        header("Pragma: no-cache");
        header("Expires: 0");

// définit le type de contenu à transférer, ici de la vidéo
        header("Content-Type: video/mp4");
        header("Content-Transfer-Encoding: binary");

// force le téléchargement du fichier avec le nom du fichier
        header("Content-Type: application/force-download");
        header('Content-Disposition: attachment; filename="'.$name.'"');

// indique la taille du fichier à télécharger
        header("Content-Length: ".$size);
// envoi le contenu du fichier
        readfile($filename); 
    }else{
        echo 'la fichier contient des caractères non conformes !';
        die();
    }
} else {
    echo 'token non conforme';
    die();
}
?>

Pour les gros fichiers vidéos:

suite à la mise en place de script de téléchargement, vous pouvez avoir des erreurs 500 du type out of memory.
Ce type d’erreur apparait lorsque les fichiers sont gros (supérieur à 300Mo)
Pour éviter de type d’erreur il faut modifier le fichier de configuration de php : php.ini et augmenter la valeur de la directive memory_limit

php.ini

memory_limit = 1024M