Insertion de gros fichier dans un longblob mysql [Résolu]

misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 2 juin 2007 à 18:29 - Dernière réponse : misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 3 juin 2007 à 11:17
bonjour,
je viens d'essayer d'insérer un fichier dans un longblob avec mi-succes.
je dis ca car les petit fichier < à la taille d'un mp3 passe mais un mp3 (3mo ou plus) ne passe pas...

voici une partie de mo code en php

ajouteFichier($HTTP_POST_FILES['fichier'],$HTTP_POST_VARS['description']);

et le code de la fonction

function ajouteFichier($infoFichier,$description)
{
if($infoFichier['tmp_name']=='') erreur('fichier introuvable');
$db = mysql_connect("localhost","root","...")
or erreur("erreur de connexion &agrave; la base de donn&eacute;e");
if($db!=0)
{
mysql_select_db("forum",$db) or erreur(mysql_error()) ;
$requete = "insert into fichiers(id_user,description,nom,type,taille,fichier) values ('".
addslashes($_SESSION['id_login'])."','".
addslashes($description)."','".
addslashes($infoFichier['name'])."','".
addslashes($infoFichier['type'])."','".
addslashes($infoFichier['size'])."','".
addslashes(fread(fopen($infoFichier['tmp_name'],"rb"),filesize($infoFichier['tmp_name'])))."')";
mysql_query ($requete,$db) or erreur(mysql_error()) ;
mysql_close($db);
}
}

evidemment, comme on le voit, tout le fichier est passé dans une grosse requete.
y a-t-il moyen de passer le fichier dans plusieur requete ou alors une autre technique ?
en tout cas moi je dois avouer que je ne connais rien d'autre :-(
pouvez vous m'aider ?

moi, le seul, l'unique, ZinZin [:I]
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 3 juin 2007 à 11:17
3
Merci
donc en résume:
pour utiliser plainement les blob de mysql:
modifier php.ini (chercher les variables et les modifier)
post_max_size = 200M
upload_max_filesize = 200M

puis redémarrer apache.
ensuite: exécuter la requete sql suivante
SET GLOBAL max_allowed_packet=200000000

en principe: replacer GLOBAL par SESSION et exécuter juste après la requete d'ajout de fichier serait plus raisonable.
pour les test j'ai utilisé movamp sous windows xp sp2
j'imagine que sous linux le principe reste le meme.

merci J_G pour tes liens très intéressant :-)

moi, le seul, l'unique, ZinZin [:I]

Merci misterzinzin 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de misterzinzin
misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 2 juin 2007 à 18:37
0
Merci
j'ai oublié de dire que j'ai l'erreur:

if($infoFichier['tmp_name']=='') erreur('fichier introuvable');

donc maintenant que j'y pense, le probleme se situe avant d'envoyer vers la base de donnée.
donc je supose qu'il y à une limite au niveau du serveur web (apache)

moi, le seul, l'unique, ZinZin [:I]
Commenter la réponse de misterzinzin
J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Dernière intervention
28 août 2007
- 2 juin 2007 à 19:42
0
Merci
Genau !!!

La taille des fichiers uploadable est au moins limités deux fois par ton serveur :
Config Apache (je ne sais pas trop où)

Config php.ini
Related Configurations Note:
See also the file_uploads,
upload_max_filesize,
upload_tmp_dir,
post_max_size and
max_input_time directives
in <var>php.ini</var>

A voir aussi : http://de2.php.net/manual/en/features.file-upload.errors.php

A+
Commenter la réponse de J_G
misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 3 juin 2007 à 10:31
0
Merci
oui effectivement, en modifiant la ligne
upload_max_filesize = 2M

par
upload_max_filesize = 200M

le fichier est apparement bien uploadé
maintenant, c'est au niveau de mysql que ca coince
mysql_error() me retourne ceci:
MySQL server has gone away
que veut dire ce message ?

moi, le seul, l'unique, ZinZin [:I]
Commenter la réponse de misterzinzin
misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 3 juin 2007 à 10:56
0
Merci
apparement, ca vient de la requete sql qui est trop grande.
en effet, si on exécute (dans phpmyadmin par exemple)
SHOWVARIABLES

on recupere toute une série de variable dont:
max_allowed_packet 1047552

il faut donc changer cette variable avant d'envoyer une grosse requete:
SET GLOBAL max_allowed_packet=200000000

et maintenant ca marche.
donc en résumé, il faut modifier le fichier php.ini:
upload_max_filesize = 200M

puis après avoir redémarré le serveur (ou autre manipulation permettant de faire relire le fichier de config)

exécuter la requete sql suivante

SET GLOBAL max_allowed_packet=200000000

(oui bon... ca ne fait pas vraiment 200 MO mais bon...)

remarque: il y à surement moyen de le faire directement en passant par le fichier de config de mysql mais je ne l'ai pas touvé.

donc maintenant ca passe très bien avec un fichier mp3

Cristina Aguilera - Hurt.mp3, audio/mpeg, 5552128, [BLOB - 5,3 Mio], 2007-06-03 10:48:12
mais... pas avec un fichier de 75Mo
donc il doit y avoir une autre limitation (apache ?)

moi, le seul, l'unique, ZinZin [:I]
Commenter la réponse de misterzinzin
misterzinzin
Messages postés
112
Date d'inscription
vendredi 27 octobre 2000
Dernière intervention
26 janvier 2011
- 3 juin 2007 à 11:11
0
Merci
j'avais oublié de modifier

post_max_size = 8M

par

post_max_size = 200M


évolution de l'histoire:

avant, avec mon fichier de 75Mo je n'avais pas d'erreur mais ca ne marchais pas
maintenant, ca marche.
cependant, en regardant l'évolution de la mémoire ram... ca fait assez peur.
en fait tout le fichier est stocké en ram et donc pour un pc qui est en général à 900Mo de ram utilisé, j'ai eu des pointe jusqu'a 1,2Go lors de l'upload de mon fichier.
donc 300Mo pour un fichier de 75Mo
mon hypothése:
75*2 (pour le addslashes)=150Mo en cache de apache (ou php?)+les 150Mo du fichié transféré en mémoire vers mysql
mais on... ca marche.

je pense que je n'atteindrait jamais la limite d'un longblob (4Go)...

moi, le seul, l'unique, ZinZin [:I]
Commenter la réponse de misterzinzin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.