> Tous les forums > Forum des Webmasters
 enregistrer pièces jointes via menu sur serveur
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
t671
  Posté le 01/09/2009 @ 17:05 
Aller en bas de la page 
Astucien

Bonjour,

Je souhaiterais pour un de mes sites créer un menu de gestion qui permette à une personne d'insérer dans une page du site du texte avec affichege d'une pièce jointe.
Le menu existe déjà en php qui permet d'enregistrer un texte dans une base de donnée, et d'afficher celui-ci dans une page html.

<h4><font color="#800000"><u>Texte de la manifestation :</u></font></h4><p>
Surligner le texte, puis sélectionner le format :<br>
<a href="#" onclick="TAinsert('<b>','</b>');OpenPreview();" style="text-decoration: none"><b>Gras </b></a> -
<a href="#" onclick="TAinsert('<i>','</i>');OpenPreview();" style="text-decoration: none"><i>Italique </i></a> -
<a href="#" onclick="TAinsert('<u>','</u>');OpenPreview();"><u>Souligner</u></a> -
<a href="#" onclick="TAinsert('<center>','</center>');OpenPreview();" style="text-decoration: none">Centrer</a> -
<a href="#" onclick="TAinsert('<font color=#FF0000>','</font>');OpenPreview();" style="text-decoration: none">
<font color="#FF0000">Rouge</font></a>
<p>

<textarea cols="70" name="texte" id="texte" rows="20" wrap="VIRTUAL" accesskey="c" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onchange="storeCaret(this);" ></textarea><p>
<h4><font color="#800000"><u>Insérer une pièce jointe :</u></font></h4> sélectionner le fichier sur votre disque dur<p>

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????


<input type="submit" name="preview" value="Valider">
<input type="reset" value="Effacer"><p>
<input type="button" name="lien" value="Affichage des manifestations" onClick="self.location.href='aff-manif.php'">
</form></center>
</body></html>

Je voudrais rajouter qu'au moment de la saisie du texte, il y ait la possibilité de sélectionner une pièce jointe (doc), de la téléchargher sur un serveur (comme le texte a été télécharger dans la base de donnée), et qu'à l'affichage de la page et du texte, la pièce jointe s'affiche.

Merci pour votre aide.



Modifié par t671 le 01/09/2009 18:05
Publicité
Malcolm
 Posté le 01/09/2009 à 20:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

<input type="file" name="monfichier">

mais cela implique :

- que tu aies le droit d'écriture sur un dossier

- que tu aies un maximum de taille à télécharger (pas Q? d'imaginer uploader 650 Mo) - à voir dans ton php.ini, que tu ne peux pas modifier sur un hébergement type Free ou mutualisé (en général 2 Mo au total)

- que tu as une certaine sécurité sur ton serveur (sinon moi je t'uploade un fichier PHP tu vas voir )

- que tu ne te bases pas sur l'extension du fichier pour connaitre son type

- que tu déclares ton formulaire avec un encodage multiple : <form ....... enctype="multipart/form-data">

après le reste est c$oté serveur. Si tu passes par PHP, tu auras un tableau $_FILES qui contient les indexes name, tmp_name, size entres autres. A toi de faire l'opendir qu'il faut pour écrire le fichier où il le faut ... un exemple avec la doc : http://fr.php.net/manual/fr/features.file-upload.post-method.php

t671
 Posté le 03/09/2009 à 18:13 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour et merci Malcom pour tes conseilles.

Je suis entrain de travailler sur l'upload de fichier en php (en local), et j'ai un 'tit souci avec le test sur la taille du fichier à uploader qui ne fonctionne pas.

Dans mon html j'ai ceci (mais est-ce vraiment utile ????) :

<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />

Dans mon php, j'ai ceci :

............................
$taille_maxi = 1000000;
$taille = filesize($_FILES['monfichier']['tmp_name']);
..................

if($taille>$taille_maxi)
{
$erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
//On formate le nom du fichier ici...
$fichier = strtr($fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo 'Upload effectué avec succès !';
}
else //Sinon (la fonction renvoie FALSE).
{
echo 'Echec de l\'upload !';
}
}
else
{
echo $erreur;
}
?>

Et si j'upload un fichier > 1Mo, j'ai le message "échec de l'upload", et non " Le fichier est tros gros".

Pourrais-tu, toi ou quelqu'un d'autre, m'aider à trouver mon erreur. Ca fait un moment que je cherche ....

Merci

Malcolm
 Posté le 05/09/2009 à 11:39 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Regarde dans ton PHP.ini : tu dois avoir une ligne qui indique upload max size et une autre ligne post max size. Regarde combien elles valent. Et si tu fais des changements, n'oublie pas de relancer Apache/PHP.

D'autre part, dans $_FILES['monfichier'] t'as déjà la taille, pas besoin de faire un filesize : $_FILES['monfichier']['size']

Sinon je vois que tu uploades dans $dossier.$fichier : où est défini $dossier ? DTC?

Plus sérieusement, assure-toi que c'est un dossier valide, qu'il se finit bien par un / et il faut aussi faire un opendir avant...

tu le fais en local, je présume que t'es sous windows donc tu dois avoir par défaut la permission d'écriture, mais sous linux, il faudra le vérifier ...

t671
 Posté le 05/09/2009 à 19:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Salut Malcom,

J'ai vérifié mon php.ini, et effectivement il est à 2M. Il me semble que chez Free, l'upload est également limité à 2M ! C'est acceptable, mais si on veut encore réduire l'upload par rapport à Free ? Par exemple à 1,5M. On fait comment ? En limitant « name="MAX_FILE_SIZE" value="1500000" » et « $taille_maxi = 1500000 » ?

Pour répondre à ta question, je suis pour l'instant en local, et $dossier est un fichier de mon disque dur. Ce n’est que du test !

Sinon, mes tests avec des fichiers < 2M fonctionnent correctement. Les fichiers sont bien enregistrés à l'endroit où je veux, et je récupère le chemin de mon fichier que je place dans un champ de ma BD.

Là, j’ai testé de télécharger un fichier de 2094Ko (pour tester la limite des 2M), et mon test dit « Echec du chargement ! », et non « Le fichier est trop gros...» ??? Pourquoi ?

// --------------------test upload fichier------------------------------

$dossier = './dossier_upload/';
$fichier = basename($_FILES['monfichier1']['name']);
$taille_maxi = 2000000;
$taille = filesize($_FILES['monfichier1']['tmp_name']);
$extensions = array('.gif', '.jpg', '.jpeg', '.doc', '.txt', '.pdf', '.PDF', '.GIF', '.JPG', '.JPEG', '.DOC', '.TXT');
$extension = strrchr($_FILES['monfichier1']['name'], '.');
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
$erreur = 'Vous ne pouvez uploader que des fichiers de type gif, jpg, jpeg, txt, pdf ou doc';
}
if($taille>$taille_maxi)
{
$erreur = 'Le fichier est trop gros. Il doit être inférieur à 2Mo';

}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
//On formate le nom du fichier ici...
$fichier = strtr($fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);

//----------------------------upload fichier--------------------------------

if(move_uploaded_file($_FILES['monfichier1']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo 'Chargement effectué avec succès !';

// on écrit la requête sql
$sql = "INSERT INTO manifestations(date, titre, texte, lien_fichier) VALUES('$date', '$titre', '$chaine', '$dossier/$fichier')";

// on insère les informations du formulaire dans la table
mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error());
}
else //Sinon (la fonction renvoie FALSE).
{
echo 'Echec du chargement !';
}
}
else
{
echo $erreur;
}

Et si je veux enregistrer plusieurs fichiers à joindre pour le même enregistrement de ma BD, est-il possible de sélectionner les fichiers les uns à la suite des autres en cliquant à chaque fois sur "Parcourir", de sorte qu'ils soient enregistrés dans le même champ de la BD ? Par la suite, je voudrais lire le champ "lien_fichier" et afficher ce qui correspond au(x) lien(s) qui s'y trouve(nt).

Malcolm
 Posté le 05/09/2009 à 22:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

pour ce qui est de la limite des 2M, c'est déjà 2 48 ko et non 2 094 ... 2 094 est supérieur à 2M

Ensuite, ne t'attends pas à pouvoir modifier ça sur Free. Dans tes rêves

Donc par php, un upload de fichier de plus de 2Mo dans ces conditions = c'est niet.

Pour uploader plusieurs fichiers :

<input type="file" name="fichier_1">

<input type="file" name="fichier_2">

...

<input type="file name="fichier_X">

En sachant que tu récupèreras $_FILES['fichier_1']['tmp_name'], $_FILES['fichier_1']['size'], $_FILES['fichier_2']['tmp_name'], etc.... Donc exactement la même chose que pour ton unique fichier si ce n'est que t'as fichier_1, fichier_2 ...

ATTENTION : la somme des tailles de tous tes fichiers ne doit pas dépasser post_max_size (qui est donc limité à 2 Mo sur Free).

Ensuite, pour la vérif des extensions, tu ne m'as pas écouté vérifier l'extension d'un fichier est totalement idiot. Je crée un mp3, je le renomme en PDF et il sera téléchargé sur ton serveur ...

Enfin, pour ce qui est d'insérer plusieurs liens dans ton champ SQL, c'est possible, en les séparant par un retour chariot par exemple.

Mais bon, j'espère que tu protèges tes champs SQL, parce que ton INSERT, je le trouve "crade".

t671
 Posté le 06/09/2009 à 12:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour Malcolm,

Pour l’upload à 2M, ça me suffit. Car ce ne sera que des documents ou des images qui seront uploadés, par des personnes connus.

Par contre, je n’avais pas pensé que la somme des fichiers uploadés ne devait pas dépassé la limite des 2M. C’est pourtant évident … !!! Faudra que j’adopte une tactique différente à ce que je veux faire !

Pour la verif des extensions, ça ne sert alors à rien !!!!! Qu’à titre info, éventuellement !

OK pour le retour chariot ! Faudra que je vois à l’insérer après chaque enregistrement du lien.

Pourquoi dis-tu que mon INSERT est « crade » ? Vaut mieux les faire comment, alors ?

Merci

Malcolm
 Posté le 07/09/2009 à 01:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

pour les types de fichiers, tu as le type MIME qui et envoyé : $_SERVER['fichier_1']['type']qui enverra imaage/gif par exemple. C'est une solution *un peu mieux* dans la mesure où ça reflète le type réel du fichier. Mais c'est pas à 100% sécurisé vu que c'est envoyé par le navigateur... Si tu veux une sécurité côté serveur, elle existe pour les images, mais pour des docs autres, je n'ai pas trouvé.

pour la requête : j'ai personnellement horreur des variables injectées directement dans une chaine de caractères.

L'idéal étant des requêtes préparées, mais sur Free tu n'y auras pas accès, il te reste encore un début de solution ainsi :

$sql = sprintf("INSERT INTO ta_table (champ1, champ2, champ3) VALUES ('%s', '%s', '%d');", $var1, $var2, $var3);

en sachant que %s est formaté en chaine de caractères, %d en décimal (entier numérique). ça te permet de préparer tes variables$var1, $var2 et $var3 de mon exemple avant la requête en échappant les caractères qu'il faut et de les insérer dans la requête typés texte ou numérique. Il existe aussi %f et %h mais je présume que tu n'as pas de nombre à virgule flottante ou hexa à insérer.

Tu noteras qu'il y a autant de %qqch que de variables. Je t'invite à voir la doc de sprintf() sur le site de PHP si t'as besoin de plus d'infos.

t671
 Posté le 08/09/2009 à 18:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour Malcolm, et merci des conseils. Mais j'approndirais plus par la suite. Je vais déjà essayer de faire ce que j'ai en tête !!!!!

Là, je bloque sur de la syntaxe. Un des champs de ma BD (champ "lien_fichier"), comporte un ou des liens qui pointes sur des images ou documents enregistrés sur un serveur. A l'affichage de ma page web et du champ concerné, je voudrais voir le document. Mais là je ne vois que le lien.

J'avais donc pensé un truc du genre :

// où se trouve mes documents

$dossier = 'http://............../gestion/manifestations/test/dossier_upload';

// le document

$fichier = basename($_FILES['monfichier']['name']);

// le lien préformaté qui pointera sur le document et l’affichera sur la page web

$lien = '<a href="$dossier" target="wclose"><img src="$dossier" width="201" height="285" border=no></a>' ;

Mais c'est pas génial ...... Hein ..... !!!!! En tout ça fonctionne pas et je n'arrive pas à trouver .....



Modifié par t671 le 08/09/2009 18:51
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
129,99 €Ecran Lenovo 24 pouces G24-10 (Full HD, TN, 144 Hz, FreeSync) à 129,99 €
Valable jusqu'au 22 Janvier

Cdiscount propose actuellement l'écran 24 pouces Lenovo G24-10 à 129,99 € alors qu'on le trouve ailleurs à plus de 160 €. Cet écran dispose d'une dalle incurvé Full HD (1920x1080) avec un temps de réponse de 1 ms et un rafraichissement de 144 Hz. Il possède des entrées DP et HDMI. Il est compatible Freesync.  


> Voir l'offre
21,43 €Souris sans fil Logitech M280 à 21,43 €
Valable jusqu'au 21 Janvier

Amazon fait une petite promotion sur la souris sans fil Logitech M280 qui passe à 21,43 €. On la trouve ailleurs à partir de 30 €. Sa forme profilée est adaptée aux droitiers. Son autonomie est de 18 mois (pile AA que vous pourrez remplacer).


> Voir l'offre
-40%Mois du Blanc : jusqu'à -40% sur une sélection Linge de Maison
Valable jusqu'au 13 Février

Couettes, matelas, linge de lit et bien plus encore : c'est le mois du blanc sur Amazon avec jusqu'à -40% sur une sélection de produits.


> Voir l'offre

Sujets relatifs
formulaire avec pièces jointes
Google Keyword Planner (menu outil) gratuit ?
Probleme de mise en ligne de fichier sur un serveur
Différence entre enregistrer...acheter un « nom de domaine
positionner un menu dynamique
Centrer menu!!
Target dans menu déroulant "option value=...." html
Comment centrer le menu
Script menu ne s'affiche pas sur IE7
Menu déroulant devenu inactif
Plus de sujets relatifs à enregistrer pièces jointes via menu sur serveur
 > Tous les forums > Forum Forum des Webmasters