Telechargement d'un fichier

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Telechargement d'un fichier

Re: Telechargement d'un fichier

par AB » 22 sept. 2011, 17:17

Ouais j'ai fais ca, j'ai mis le code suivant avant l'enregistrement : $nom_fichier=str_replace(' ','_',$nom_fichier);

Ca doit revenir au meme.
Ben pas tout à fait :!: Ce que je t'ai montré plus haut fais plus qu'un seul remplacement. Il n'y a pas que les espaces qui peuvent créer des problèmes :wink:

Re: Telechargement d'un fichier

par Mirrix » 22 sept. 2011, 17:11

Ouais j'ai fais ca, j'ai mis le code suivant avant l'enregistrement : $nom_fichier=str_replace(' ','_',$nom_fichier);

Ca doit revenir au meme.

Merci beaucoup en tout cas !!

Re: Telechargement d'un fichier

par AB » 22 sept. 2011, 16:51

Pour avoir un nom de fichier valide tu peux faire (exemple dans ce tuto sur le téléchargement de fichiers) :
        // Remplacement des caractères accentués par leur équivalent
        $nom_fichier = iconv('UTF-8', 'ASCII//TRANSLIT', $localfile);
        // Nettoyage des caractères non valides (reste les caractères alphanumériques et '.', '_', '-')
        $nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
...mais iconv n'est pas toujours bien configuré sur les serveurs.

Une solution plus passe partout mais moins élégante (exemple dans cette classe de téléchargement) :
        $cible = array(
        'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą',
        'Ç', 'Ć', 'Č', 'Œ',
        'Ď', 'Đ',
        'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą',
        'ç', 'ć', 'č', 'œ',
        'ď', 'đ',
        'È', 'É', 'Ê', 'Ë', 'Ę', 'Ě',
        'Ğ',
        'Ì', 'Í', 'Î', 'Ï', 'İ',
        'Ĺ', 'Ľ', 'Ł',
        'è', 'é', 'ê', 'ë', 'ę', 'ě',
        'ğ',
        'ì', 'í', 'î', 'ï', 'ı',
        'ĺ', 'ľ', 'ł',
        'Ñ', 'Ń', 'Ň',
        'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő',
        'Ŕ', 'Ř',
        'Ś', 'Ş', 'Š',
        'ñ', 'ń', 'ň',
        'ò', 'ó', 'ô', 'ö', 'ø', 'ő',
        'ŕ', 'ř',
        'ś', 'ş', 'š',
        'Ţ', 'Ť',
        'Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű',
        'Ý', 'ß',
        'Ź', 'Ż', 'Ž',
        'ţ', 'ť',
        'ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű',
        'ý', 'ÿ',
        'ź', 'ż', 'ž',
        'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
        'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р',
        'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
        'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
        );
                                 
        $rempl = array(
        'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A',
        'C', 'C', 'C', 'CE',
        'D', 'D',
        'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a',
        'c', 'c', 'c', 'ce',
        'd', 'd',
        'E', 'E', 'E', 'E', 'E', 'E',
        'G',
        'I', 'I', 'I', 'I', 'I',
        'L', 'L', 'L',
        'e', 'e', 'e', 'e', 'e', 'e',
        'g',
        'i', 'i', 'i', 'i', 'i',
        'l', 'l', 'l',
        'N', 'N', 'N',
        'O', 'O', 'O', 'O', 'O', 'O', 'O',
        'R', 'R',
        'S', 'S', 'S',
        'n', 'n', 'n',
        'o', 'o', 'o', 'o', 'o', 'o',
        'r', 'r',
        's', 's', 's',
        'T', 'T',
        'U', 'U', 'U', 'U', 'U', 'U', 'U',
        'Y', 'Y',
        'Z', 'Z', 'Z',
        't', 't',
        'u', 'u', 'u', 'u', 'u', 'u', 'u',
        'y', 'y',
        'z', 'z', 'z',
        'A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P',
        'a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p',
        'C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R',
        'c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r'
        );
                 
        $nom_fichier = str_replace($cible, $rempl, $nom_fichier);

        $nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
En cas de besoin, si tu veux renommer un fichier s'il est déjà existant sur le serveur tu peux regarder les liens ci-dessus.

Re: Telechargement d'un fichier

par Mirrix » 22 sept. 2011, 15:43

Tu veux dire que toi avec tes espaces ca marche bien ?

Mon code final pour la page telechargement.php est :

Code : Tout sélectionner

<?php if (isset($_POST['telecharger_fichier'])) { $nom_fichier = $_POST['telecharger_fichier'] ; $file = 'I:\test/'.$nom_fichier; header('Content-Type: application/octet-stream'); header('Content-Length: '. filesize($file)); header('Content-disposition: attachment; filename='. basename($file)); header('Pragma: no-cache'); header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Expires: 0'); readfile($file); } ?>

Re: Telechargement d'un fichier

par moogli » 22 sept. 2011, 15:25

oui faut supprimer les espaces et d'ailleurs tout caractères spécieux de nom de fichier.
en règle général un nom de fichier ne devrais pas comporter de caractère "à la mord moi le nœud" :mrgreen:

globalement que de lettres (minuscule ou majuscule), des chiffres et les tirets - ou _ rien d'autre après ça met le brin.

ceci est a faire a l'enregistrement du fichier sur le disque.

après rien ne t’empêche de garder le nom d'origine dans la table et de faire la correspondance avec un nom différent sur le disque (par exemple une chaine aléatoire).

après j'ai testé le bout de code que je t'ai mis au dessus et j'ai pas de soucis avec un fichier nommé ainsi : dompdf version 0-6-0_beta2.zip

après faut voir ton code final que l'on vois s'il n'y pas un truc qui pourrait clocher.

@+

Re: Telechargement d'un fichier

par Mirrix » 22 sept. 2011, 14:29

Ok.

Par contre lorsque je veux télécharger un fichier ou le nom comporte des espaces, le fichier n'est pas bon car il arrête le nom au premier espace (donc pas d'extensions). Est ce possible de le rendre insensible aux espaces ?

Re: Telechargement d'un fichier

par moogli » 22 sept. 2011, 11:24

Le formulaire que tu as rajouté a la fin il te sert a quoi ?
a simuler le tiens que je n'aivais pas :mrgreen:

@+

Re: Telechargement d'un fichier

par Mirrix » 22 sept. 2011, 09:01

Ahhh oui ca marche !!

Le formulaire que tu as rajouté a la fin il te sert a quoi ?

Re: Telechargement d'un fichier

par moogli » 21 sept. 2011, 21:08

salut,

$file = 'I:\test/'$nom_fichier''; <= ça doit donner une PARSE_ERROR ça si tu n'en a pas il faut vérifier ton ton niveau d'erreur (error_reporting(E_ALL|E_STRICT); pour php5).

j'ai testé ton code avec succès (ajout du formulaire pour test)
<?php
if (isset($_POST['telecharger_fichier'])) {
    $nom_fichier = $_POST['telecharger_fichier'] ;

    $file = 'chemin'.$nom_fichier;

    header('Content-Type: application/octet-stream');
    header('Content-Length: '. filesize($file));
    header('Content-disposition: attachment; filename='. basename($file));
    header('Pragma: no-cache');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
readfile($file);
}
else {
    $f = glob('*.zip');
    $x = '';
    foreach ($f as $fz){
        $x .= '<input type="radio" name="telecharger_fichier" value="'.$fz.'" />'.$fz.'<br />';
    }
    echo <<<form
    <form method="post">
        $x
        <input type="submit" name="go" value="telecharger" />
    </form>
form;
}
?>
edit : correction du code (oubli d'une ')

@+

Telechargement d'un fichier

par Mirrix » 21 sept. 2011, 15:35

Bonjour,

Alors voila je voudrais faire un script permettant à l'utilisateur de télécharger le fichier dont il aura sélectionné le nom dans une liste déroulante. J'ai tenté de faire un code mais cela ne marche pas ... :( pouvez vous me dire pourquoi ?

Code : Tout sélectionner

<?php $nom_fichier = $_POST['telecharger_fichier'] ; $file = 'I:\test/'$nom_fichier''; header('Content-Type: application/octet-stream'); header('Content-Length: '. filesize($file)); header('Content-disposition: attachment; filename='. basename($file)); header('Pragma: no-cache'); header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Expires: 0'); readfile($file); exit(); ?>
'telecharger_fichier' est le nom du menu déroulant.
Le fichier se trouve dans le répertoire "I:\test" mais l'utilisateur peut choisir un fichier différent dans ce même répertoire.

Merci d'avance pour votre aide :)