Bonjour,

Je suis en train de developper un explorateur de fichier uniquement en PHP pour m'entrainer et en apprendre un peu plus sur les fonctions. J'ai déjà réalisé la navigation entre les dossier, la fonction pour supprimer fichier et dossier et aussi celle pour créer un fichier. Je suis en train de faire celle qui aura pour but de télécharger un fichier ou un dossier. Pour l'instant pour fonctionne très bien sauf quand j'essaie de télécharger un fichier vide ( de n'importe quelle extension) : je le télécharge bien mais quand je l'ouvre le fichier contient tous le code html que j'ai écrit dans ma page... D'après les test que j'ai fait cela vient uniquement du readfile mais je trouve cela bizarre ^^ je vous met à la suite la fonction download et son appel que j'au volontairement raccourcis pour vous :)

function download($fichier){
    header('Content-Type:application/octet-stream');
    header('Content-Disposition: attachment; filename="' . basename($fichier) . '"');
    header('Pragma: no-cache');
    header('Cache-Control: no-store, no-cache,must-validate, post-check=0, pre-check=0');
    header('Expires: 0');
    readfile(realpath($fichier));
}
if(isset($_POST['download'])){ //Mon bouton pour télécharger
    if(isset($_POST['file']) && !empty($_POST['file'])){ //Le nom du fichier à télécharger
        if(!is_dir($_POST['file'])){
            download($_POST['file']); //Appel à ma fonction
        }
    }else{
        'Aucun fichier n\'est séléctionner';
    }
} 

Si quelqu'un a une idée je suis preneur car là j'avoue que je sèche un peu

1 réponse


Voici le code d'un helper sous codeigniter:

function force_download($filename = '', $data = '', $set_mime = FALSE)
    {
        if ($filename === '' OR $data === '')
        {
            return;
        }
        elseif ($data === NULL)
        {
            if ( ! @is_file($filename) OR ($filesize = @filesize($filename)) === FALSE)
            {
                return;
            }

            $filepath = $filename;
            $filename = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $filename));
            $filename = end($filename);
        }
        else
        {
            $filesize = strlen($data);
        }

        // Set the default MIME type to send
        $mime = 'application/octet-stream';

        $x = explode('.', $filename);
        $extension = end($x);

        if ($set_mime === TRUE)
        {
            if (count($x) === 1 OR $extension === '')
            {
                /* If we're going to detect the MIME type,
                 * we'll need a file extension.
                 */
                return;
            }

            // Load the mime types
            $mimes =& get_mimes();

            // Only change the default MIME if we can find one
            if (isset($mimes[$extension]))
            {
                $mime = is_array($mimes[$extension]) ? $mimes[$extension][0] : $mimes[$extension];
            }
        }

        /* It was reported that browsers on Android 2.1 (and possibly older as well)
         * need to have the filename extension upper-cased in order to be able to
         * download it.
         *
         * Reference: http://digiblog.de/2011/04/19/android-and-the-download-file-headers/
         */
        if (count($x) !== 1 && isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/Android\s(1|2\.[01])/', $_SERVER['HTTP_USER_AGENT']))
        {
            $x[count($x) - 1] = strtoupper($extension);
            $filename = implode('.', $x);
        }

        if ($data === NULL && ($fp = @fopen($filepath, 'rb')) === FALSE)
        {
            return;
        }

        // Clean output buffer
        if (ob_get_level() !== 0 && @ob_end_clean() === FALSE)
        {
            @ob_clean();
        }

        // Generate the server headers
        header('Content-Type: '.$mime);
        header('Content-Disposition: attachment; filename="'.$filename.'"');
        header('Expires: 0');
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: '.$filesize);
        header('Cache-Control: private, no-transform, no-store, must-revalidate');

        // If we have raw data - just dump it
        if ($data !== NULL)
        {
            exit($data);
        }

        // Flush 1MB chunks of data
        while ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE)
        {
            echo $data;
        }

        fclose($fp);
    }