Transfert de fichier

Répondre
Prof_Matches
le 07/07/2011 à 16:00
Prof_Matches
Bonjour,

Sur mon formulaire, l'utilisateur peut choisir un fichier à m'envoyer. L'enregistrement du fichier dans le répertoire choisit fonctionne très bien. Le soucis c'est que quand un fichier portant un nom identique existe déjà dans le répertoire, il est écrasé.
J'aimerais donc enregistrer le fichier avec son nom d'origine suivi de quelque chose d'aléatoire : soit un nombre aléatoire donné par la fonction ($nom_aleatoire = md5(uniqid(rand(), true));) ou par un ID de session : et c'est là que je sèche.
Il est nécessaire également de pouvoir retrouver le nom du fichier pour pouvoir l'afficher dans une page que l'utilisateur devra valider pour envoi.

En termes plus cours : je souhaite enregistrer un fichier avec un nom unique comprenant au minimum le nom et l'extension d'origine.

Voici le code que j'ai et qui fonctionne (mais avec le nom original du fichier) :

<?php

if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{

if ($_FILES['monfichier']['size'] <= 1000000)
{

$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
$nom_aleatoire = md5(uniqid(rand(), true));
if (in_array($extension_upload, $extensions_autorisees))
{

move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($_FILES['monfichier']['name']));
echo "L'envoi a bien été effectué !";

}
}
}
?>
Prof_Matches - Namur
LupusMic
le 07/07/2011 à 22:05
LupusMic
Personnellement, j'utiliserais un datetime pour renommer le fichier.
<?php

if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{
if ($_FILES['monfichier']['size'] <= 1000000)
{
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
// Le suffixe ne garantie pas le contenu du fichier

// Le nom aléatoire n'est jamais utilisé, du coup, il faudrait que tu l'utilise ;)
$nom_aleatoire = md5(uniqid(rand(), true));
if (in_array($extension_upload, $extensions_autorisees))
{
move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($nom_aleatoire . '-' . $_FILES['monfichier']['name']));
echo "L'envoi a bien été effectué !";
}
}
}
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Prof_Matches
le 08/07/2011 à 07:41
Prof_Matches
Ha ! Bien, merci beaucoup.
J'aurais deux petites questions.
- peut-on attribuer à une variable le nom du fichier enregistré
- puis-je utiliser cette nouvelle variable pour afficher l'image avec la fonction readfile($image); ?
Prof_Matches - Namur
Prof_Matches
le 08/07/2011 à 11:30
Prof_Matches
Cela me permettrait de pouvoir afficher l'image sur une page pour demander au visiteur de confirmer l'envoi.
Prof_Matches - Namur
LupusMic
le 08/07/2011 à 11:31
LupusMic
Un nom de fichier est une chaîne de caractères, ça n'a rien de particulier.

J'ai peur de comprendre ce que tu veux faire avec readfile.
Tout d'abord, il faut comprendre une chose lorsqu'on fait du développement Web : on n'affiche jamais rien. Certes, on le dit parce que ce serait trop pénible d'expliquer aux autres pourquoi c'est incorrect, mais dans l'absolu, on fabrique un document HTML qui sera analysé et dont une représentation visuelle sera affichée à l'utilisateur par le navigateur.

Pour « afficher » une image dans une page, il faut créer un élément img et définir le contenu de son attribut src qui désigne un point d'accès à l'image.

Par exemple :
<img src='/images/lolcat-1.jpeg' alt='Business cat' />


Si ton image n'est pas accessible depuis un répertoire exporté à travers ton serveur, ou si tu veux que l'image soit calculée à la volé, tu peux utiliser readfile pour lire le fichier et le cracher au client HTTP :

<img src='/images/lolcat-1.php?name=Serious%20Cat' alt='<?php echo htmlentities($nom_image, ENT_QUOTES, 'utf-8') ?>/>


<?php
// Je ne fais pas toutes les vérifications d'usage, ce script n'est pas sécurisé.
$img_nom = './photos/' . $_GET['name'] ;
header(sprintf('Content-length: %d', filesize($img_nom)) ;
readfile($img_nom) ;


Il existe une technique pour embarquer directement le contenu de l'image dans le HTML, mais ça peut poser d'autres problèmes.

Bref, ce qu'il faut comprendre ici, c'est que la construction du visuel de la page se fait en plusieurs temps.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours