Aller au contenu

[RESOLU] Upload un fichier avec PHP ?


ggbce

Messages recommandés

Je suis entrain de faire une belle page qui me permet de uploader des fichiers vers mon serveur web avec du php.

J'ai suivi les infos du manuel de php, mais ça ne marche pas full bien.

1- Le fichier ne se "upload" pas !

2- Je ne suis pas capable de récupérer l'info de la taille en octets

3- La récupération du nom du fichier que je conserve dans ma BD MySQL marche... au moins.

-----

Le but c'est de rendre plus facile la mise à jour des logiciels disponibles sur mon site web pour le téléchargement via une page en mode EDIT.

-----

Voici mon code du fichier add_soft.php:

<body bgcolor="#CCCCFF" onunload="parent.window.opener.location.reload();window.close()">
<font face="Courier New">
<p><font color="#800000">Ajout logiciel</font></p>
<p>
<!-- Appel à la bonne page PHP (elle-même en réalité...) -->
<form method="post" action="add_soft.php">
<table border="0" width="100%">
<tr>
<td><b>Nom du logiciel:</b><br><input type="text" name="soft_name" size="50" maxlength="50"></td>
<td><b>Version:</b><br><input type="text" name="version" size="15" maxlength="15"></td>
<td><b>Langage:</b><br>
<select name="lang">
<option value="fr">Français
<option value="en">Anglais
<option value="es">Espagnol
<option value="na">Non disponible
<option value="all">Multi-langues
</select>
</td>
<td><b>Droits:</b><br>
<select name="free_share">
<option value="gnu">GNU
<option value="free">Gratuit
<option value="eval">Évaluation
<option value="na">Non disponible
</select>
</td>
</tr>
</table>
<b>Description:</b><br><input type="text" name="description" size="70" maxlength="200"><br>
<table border="0" width="100%">
<tr>
<td>Fichier <INPUT NAME="userfile" TYPE="file"></td>
</tr>
</table>
<input type="submit" value="Ajouter"><br>
</form>
</font>
<font face="Verdana" size="-2" color="red">
<b>
<?php
$soft_name = $_POST['soft_name'];
$version = $_POST['version'];
$lang = $_POST['lang'];
$free_share = $_POST['free_share'];
$description = $_POST['description'];
$categorie = "windows";
$lien = $_POST['userfile']; //METHOD $HTTP_POST_FILES[''] marche pas non plus
$taille = $_POST['userfile_size']; //RESTE A TROUVER POUR QUE CA MARCHE POUR LA TAILLE
if (empty($soft_name))
{
print ("Un nom doit être spécifié");
exit();
}
else
{
if (empty($description)){$description = "description non disponible";}
move_uploaded_file($lien, "/serveur/stockstore/soft/list/");
mysql_connect('localhost', 'user', 'password') or die('Impossible de se connecter au serveur');
mysql_select_db('mabdd') or die('Base de données inexistante');
$sql = "INSERT INTO logiciels(soft_name,version,lang,free_share,description,taille,lien,categorie) VALUES('$soft_name','$version','$lang','$free_share','$description','$taille','$lien','$categorie');";
mysql_query($sql) or die ('Erreur d\'écriture dans la table');
print ("Ajouté avec succès !");
mysql_close();
}
?>	
</b>
</font>
</p>
</body>

Lien vers le manuel PHP 4 à propos de l'upload:

http://stock.zapto.org/docs/php/features.file-upload.html

Lien vers le commentaire
Partager sur d’autres sites

Jette un coup d'oeil ici dans un premier temps PHP.net

Je ne comprends pas tes deux lignes là :

$lien = $_POST['userfile']; //METHOD $HTTP_POST_FILES[''] marche pas non plus
$taille = $_POST['userfile_size']; //RESTE A TROUVER POUR QUE CA MARCHE POUR LA TAILLE

ce ne sont pas des variables globales $_POST.

Tu dois utiliser :

$lien = $_FILES['userfile']['name'];

$taille = $_FILES['userfile']['size'];

Lien vers le commentaire
Partager sur d’autres sites

Bon finalement avec un peu de modification ça marche !!!!

en tout cas je peux uploader des fichiers :eeek2:

Sauf que j'ai un autre problème. Lorsque j'envoie un fichier de grande taille (ou un moyen par une connexion basse vitesse) quand je fais le submit si après env. 45 secondes le fichier n'est pas complètement envoyé le navigateur Internet Explorer me retourne une page "Impossible d'afficher la page".

NOTE: Ce n'est pas un problème de config de php.ini (j'ai augmenté la taille maximum à 400 Mo, au-lieu de 2Mo). Quand je suis local à 100Mbps je n'ai pas vraiment de problème car la vitesse de transfert ne me donne pas le temps d'avoir un timeout (pas essayé avec un fichier de 400Mo mais probablement qu'après le temps d'expiration j'aurais le même symptôme.

-------------------------------

Ma question: Y'a t-il moyen de prolonger le temps d'attente du navigateur durant l'envoi du fichier à partir du code de la page (créer une genre d'émulation qu'il n'y ait pas de temps d'expiration ??? :craint:

------------------------------

En passant, voici ma nouvelle programmation pour l'envoi qui marche très bien avec une bonne validation:

Je l'ai divisé en 2 fichiers, c'est mieux comme ça

add_soft.html ->

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Ajout logiciel</title>
</head>
<body bgcolor="#CCCCFF"> 
<font face="Courier New">
<p><font color="#800000">Ajout logiciel Windows</font></p>
<p>
<form enctype="multipart/form-data" method="post" action="upload.php">
<table border="0" width="100%">
<tr>
<td align="left"><b>Nom du logiciel:</b><br><input type="text" name="soft_name" size="50" maxlength="50"></td>
<td align="left"><b>Version:</b><br><input type="text" name="version" size="15" maxlength="15"></td>
<td align="left"><b>Droits:</b><br>
<select name="free_share">
<option value="gnu">GNU
<option value="free">Gratuit
<option value="eval">Évaluation
<option value="na">Non disponible
</select>
</td>
</tr>
<tr>
<td align="left"><b>Description:</b><br><input type="text" name="description" size="50" maxlength="200"></td>
<td align="left"><b>Langage:</b><br>
<select name="lang">
<option value="fr">Français
<option value="en">Anglais
<option value="es">Espagnol
<option value="na">Non disponible
<option value="all">Multi-langues
</select>
</td>
<tr>
<td align="left"><b>Fichier:</b> <i>(max. 400 Mo)</i><br><INPUT NAME="userfile" TYPE="file" size="36"><input type="hidden" name="MAX_FILE_SIZE" value="400000000" /></td>
<td align="left"> <br><input type="submit" value="Ajouter Logiciel"></td>
</tr>
</table>
</form>
</p>
</font>
</body>
</html>

upload.php ->

<html>
<head>
<title>Ajout Logiciel</title>
</head>
<body bgcolor="#CCCCFF">
<font face="Courier New">
<p>
<?
$soft_name = $_POST['soft_name'];
$version = $_POST['version'];
$lang = $_POST['lang'];
$free_share = $_POST['free_share'];
$description = $_POST['description'];
$categorie = "windows";
$lien = $userfile_name;
if (empty($soft_name)) {
print ("Un nom doit être spécifié. Presser la touche BACKSPACE pour revenir.</p></font></body></html>");
exit;
}
if (empty($version)) {
print ("Un numéro de version doit être spécifié. Presser la touche BACKSPACE pour revenir.</p></font></body></html>");
exit;
}
if (empty($description)) {
print ("Une description doit être spécifié. Presser la touche BACKSPACE pour revenir.</p></font></body></html>");
exit;	
}
if (empty($userfile_name)) {
print ("Un fichier doit être associé. Presser la touche BACKSPACE pour revenir.</p></font></body></html>");
exit;	
}
if ($userfile_size > 400000000) {
   	print "Le fichier dépasse la taille maximum de 400 Mo permise. Presser la touche BACKSPACE pour revenir.</p></font></body></html>";
   	exit;
}
if (copy ($userfile, "/serveur/stockstore/soft/data/$userfile_name")) {
unlink ($userfile);
if ($userfile_size == 1) {
 $taille = $userfile_size . " octet";
 }
if ($userfile_size < 1000 && $userfile_size > 1) {
 $taille = $userfile_size . " octets";
 }
if ($userfile_size > 999999) {
 $userfile_size = ($userfile_size/1024)/1024;
 $userfile_size = number_format($userfile_size, 2, '.', '');
 $taille = $userfile_size . " Mo";
 }
if ($userfile_size > 999 && $userfile_size < 1000000) {
 $userfile_size = $userfile_size/1024;
 $userfile_size = number_format($userfile_size, 2, '.', '');
 $taille = $userfile_size . " Ko";
 }
mysql_connect('localhost', 'user', 'password') or die('Impossible de se connecter au serveur');
mysql_select_db('mabdd') or die('Base de données inexistante');
// Choisir la bonne table et les bons champs pour INSERT INTO
$sql = "INSERT INTO logiciels(soft_name,version,lang,free_share,description,taille,lien,categorie) VALUES('$soft_name','$version','$lang','$free_share','$description','$taille','$lien','$categorie');";
mysql_query($sql) or die ('Erreur d\'écriture dans la table');
echo ("Le fichier <b>$userfile_name</b> a été ajouté avec succès !");
mysql_close();
} 

else {
   	print ("Erreur durant l\'envoi du fichier.");
}
?>
</p>
<form>
<input type="button" value="Revenir à la liste" onclick="window.close();parent.window.opener.location.reload()">
</form>
</font>
</body>
</html>

Lien vers le commentaire
Partager sur d’autres sites

Tu fait l'upload depuis ou?

Car a mon travail par exemple, j'ai déja constaté qu'après un certain temps, le serveur de mon taff coupe la connection.

Donc cela vient peut être de là. Le serveur de ton taff coupe les connections web après un certain temps

On a eu ce problème avec un soft (WEBI BO), qui execute une requète et qui après x minutes donne une erreur.

Lien vers le commentaire
Partager sur d’autres sites

Comme je disais j'ai fais le test local (de mon PC vers mon serveur qui se trouvent tous les 2 à ma maison sur mon réseau 10Mbps derrière mon router/firewall Linksys). Et j'ai également fais le test depuis mon pc au bureau vers mon serveur qui est à la maison, c'est là que j'ai du trouble avec le timeout.

J'ai également un autre problème plus étrange encore :

Localement, si j'envoi avec un fichier plus gros que 8MB... toutes les valeurs postées ne sont pas reçu par PHP ???? Même les autres valeurs des autres champs.

Si j'ajoute un echo de toutes mes variables postées dans le fichier upload.php avant les if, je vois qu'aucune donnée est reçue... si le fichier attachée dépasse 8MB uniquement.

Quelqu'un à une idée ?

Lien vers le commentaire
Partager sur d’autres sites

Oui je confirme c'est bien une histoire de timeout avec PHP.

Tu peux le modifier dans ton php.ini par défaut pour tous tes scripts -ou mieux, je pense que tu peux modifier la variable globae correspondante au début de ton script d'upload.

Va voir sur nexen, ils en parlent (je pense que c'est la ligne"default_socket_timeout "60" PHP_INI_ALL"qui te concerne).

J'espère que ca va t'aider. En tout cas c'est possible je l'avais fait pour un script qui faisait du gros traitement et qui avait besoin de temps.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
NOTE: Ce n'est pas un problème de config de php.ini (j'ai augmenté la taille maximum à 400 Mo, au-lieu de 2Mo). Quand je suis local à 100Mbps je n'ai pas vraiment de problème car la vitesse de transfert ne me donne pas le temps d'avoir un timeout (pas essayé avec un fichier de 400Mo mais probablement qu'après le temps d'expiration j'aurais le même symptôme.

Désolé du retard sur ce sujet... j'avais oublié de mettre à jour.

J'ai trouvé les réponses:

Pour la taille de l'envoi, il modifier php.ini pour la taille maximum des fichiers... et également la taille maximum d'un POST !

Pour le problème de coupure après un certain temps, vous aviez raison. C'est un autre paramètre dans php.ini qu'il faut modifier. J'ai mis le délai à 12 minutes ce qui devrait être suffisant.

Merci !

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...