Téléchargement fichier avec renommage avant le téléchargement

Petit nouveau ! | 2 Messages

16 juin 2009, 09:35

Bonjour,

Premier message dans ce forum, merci d'avance pour votre aide. J'ai fait une recherche dans le forum et n'ai rien trouvé au sujet de mon problème.
Je vous explique ce que je souhaiterais faire. J'ai un fichier nommé "liste.admin" se situant dans le dossier "bdd" (ce dossier n'est accessible par personne pour des raisons de sécurité, j'ai placé un fichier ".htaccess" contenant la ligne "Deny from all" à la racine de ce dossier), le chemin d'accès est donc : bdd/liste.admin.
Je souhaiterais créer un lien pointant vers ce fichier permettant de le télécharger mais sous un autre nom, en l'occurrence, admin.csv. J'ai lu que les fonctions link et symlink permettaient de faire ça mais ça ne fonctionne pas. J'obtiens un message d'erreur : Fatal error: Call to undefined function symlink() in (j'ai essayé avec link et symlink, même message d'erreur).

Voici le code :
<?php
$source = 'bdd/liste.admin';
$cible = 'liste-admins.csv';
symlink ($source, $cible);
?>
<p><a href="<?php echo readlink($cible) ?>">Lien pour télécharger</a></p>
Questions :
  • J'ai lu que les fonctions link et symlink ne fonctionnent pas sur des fichiers distants. Cela veut-il dire que ça ne fonctionne pas dans le cadre d'un site Web ? :roll:
  • Est-ce que ces fonctions sont bien adaptées à ce que je veux faire (je n'ai pas besoin de garder de copie du fichier téléchargé, donc copier puis renommer ne m'intéresse pas, ça j'avais réussi à faire)
  • Faut-il plutôt utiliser la fonction tmpfile ?
Ah, j'oubliais de vous dire que je travaillais en local dans wamp avec la version php 5.1.30.

Merci encore. :)
Modifié en dernier par jojaba le 16 juin 2009, 14:38, modifié 1 fois.

ViPHP
ViPHP | 3300 Messages

16 juin 2009, 09:50

il te faut comprendre ce qu'est un symlink

un symlink c'est une fonctionalité d'un os unix/linux déja, et plus particulierement du filesystem, le but étant de créer une référence à un fichier, à partir d'un autre fichier, sur le même filesystem, donc fatalement ca n'existera pas sous windows avant php 5.3 et uniquement sous vista/2008 ou supérieur et il n'est pas possible de le faire de façon distante.
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 2 Messages

16 juin 2009, 10:35

Merci pour cette réponse Nagol :)
il te faut comprendre ce qu'est un symlink
Je me doutais que j'avais mal compris la chose, j'avais tenté de trouver des explications "simples" à propos de cette fonction, mais n'avais rien trouvé...
un symlink c'est une fonctionalité d'un os unix/linux déja, et plus particulierement du filesystem, le but étant de créer une référence à un fichier, à partir d'un autre fichier, sur le même filesystem, donc fatalement ca n'existera pas sous windows avant php 5.3 et uniquement sous vista/2008 ou supérieur et il n'est pas possible de le faire de façon distante.
Merci pour ces explications qui confirment que je dois utiliser un autre stratagème pour arriver à mes fins. Je m'oriente vers "tmpfile" ou "tempnam" alors, c'est ça ?


[edit]
Je viens de voir quelque chose dans le manuel php qui pourrait m'intéresser : http://www.manuelphp.com/php/function.header.php
En fin de page on dit ceci :
Si vous voulez que vos utilisateur recoivent une alerte pour sauver les fichiers générés, comme si vous génériez un fichier PDF, vous pouvez utiliser l'en-tête Content-Disposition pour fournir un nom de fichier par défaut, à afficher dans le dialogue de sauvegarde.
Le code qui accompagne ce commentaire :
<?php
// Vous voulez afficher un pdf
header('Content-type: application/pdf');

// Il sera nommé downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// Le source du PDF original.pdf
readfile('original.pdf');
?>
Seulement, je ne vois pas trop comment je mets ça en place... Le type mime pour csv est le suivant : text/csv. Mais ensuite, je ne sais pas trop ce qu'il faut que je mette... Je vais voir si j'arrive à m'en sortir seul (je pense qu'l faut que je lance un fichier php pour que ces en-têtes soient prises en compte...), sinon, je reviens ici :wink:
[/edit]


[edit2]
Eh bien, j'ai testé, j'ai vu ce que ça donnait, j'ai été bluffé :lol:
Voici comment j'ai procédé.

Code sur la page à partir de laquelle on lance le téléchargement :
<?php
$date_telechargement = date('d-m-y_H¤i¤s');
$fichier = 'bdd/liste.admin';
$nom_fichier_telechargement = 'liste-admins-'.$date_telechargement.'.csv';
?>
<p><a href="telecharger.php?fichier=<?php echo $fichier ?>&nom_telechargement=<?php echo $nom_fichier_telechargement ?>">Télécharger la liste des administrateurs</a></p>
Code du fichier "telecharger.php" :
<?php
//Récupération des données transmises par la méthode GET
$fichier = $_GET["fichier"]; 
$nom_pour_telechargement = $_GET["nom_telechargement"];
//Envoi des en-têtes pour téléchargement
header('Content-type: txt/csv');
header('Content-Disposition: attachment; filename="'.$nom_pour_telechargement.'"');
//Fichier source
readfile($fichier);
?>
Je ne sais pas si les en-têtes que j'ai mises suffisent, j'ai vu ici qu'il y en avait bien plus. Faut-il que j'ajoute quelque chose ?
En local ça marche, je verrai si à distance ça fonctionne aussi...

[/edit2]