Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1973 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Insérer un fchier .zip dans BD mysql en PHP

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Insérer un fchier .zip dans BD mysql en PHP

n°1998653
atout1
Etudiant
Posté le 03-06-2010 à 10:05:07  profilanswer
 

Bonjour, tt le monde.
 j'espère que vous allez bien  
 
j'ai un fichier .zip qui se trouve dans un répertoire et j'aimerais l'insérer dans ma BD et après le supprimer de répertoire. mais je ne sais pas comment faire ??
 
je veux faire ça sans passe par un formulaire d'uploade. actuellement, je insert normal mais ça ne marche pas, il sauvegarde que le  chemin du fichier.  
 
Merci d'avance pour votre aide  
 
A+

mood
Publicité
Posté le 03-06-2010 à 10:05:07  profilanswer
 

n°1998654
Antac
..
Posté le 03-06-2010 à 10:06:20  profilanswer
 

C'est une très très très mauvaise idée...

n°1998660
SICKofitAL​L
Razoreater
Posté le 03-06-2010 à 10:30:23  profilanswer
 

Il est justement plus logique AMHA de ne sauvegarder que le chemin vers ce fichier ZIP.


---------------
"And at the end it is only YOU, ME AND THE VIOLENCE !"
n°1998661
atout1
Etudiant
Posté le 03-06-2010 à 10:33:09  profilanswer
 

salut
 
oui je suis d'accord que c'est pas une bonne idée. mais j'ai pas le choix , je suis en stage et eux ils veulent comme ça,
si vous avez des pistes , Merci
 
bonne journée

n°1998665
SICKofitAL​L
Razoreater
Posté le 03-06-2010 à 10:40:03  profilanswer
 

Ben ca dépend de ta BDD, mais pour mySQL par exemple tu peux regarder du coté du type BLOB


---------------
"And at the end it is only YOU, ME AND THE VIOLENCE !"
n°1998674
MEI
|DarthPingoo(tm)|
Posté le 03-06-2010 à 10:44:25  profilanswer
 

Et surtout il faut faire un insert du "file_get_contents($path)"... ;)


---------------
| AMD Ryzen 7 3700X 8C/16T @ 3.6GHz - 32GB DDR4-3600 16-18-18 1T - AMD Radeon RX 5700 XT 8GB @ 2010MHz/14Gbps |
n°1998678
Antac
..
Posté le 03-06-2010 à 10:48:59  profilanswer
 

Précise bien dans ton rapport de stage qu'on t'a obligé à le faire sinon tu étais étranglé, électrocuté, piétiné, violé, etc...  
demande une décharge en trois exemplaires à ton tuteur de stage parce que tu risques de te faire défourailler à ta soutenance.
 
Sinon si c'est du MySQL:
http://www.php-mysql-tutorial.com/ [...] abase.aspx

Message cité 1 fois
Message édité par Antac le 03-06-2010 à 10:50:59
n°1998684
MEI
|DarthPingoo(tm)|
Posté le 03-06-2010 à 10:54:18  profilanswer
 

Antac a écrit :

Précise bien dans ton rapport de stage qu'on t'a obligé à le faire sinon tu étais étranglé, électrocuté, piétiné, violé, etc...  
demande une décharge en trois exemplaires à ton tuteur de stage parce que tu risques de te faire défourailler à ta soutenance.
 
Sinon si c'est du MySQL:
http://www.php-mysql-tutorial.com/ [...] abase.aspx


Le BDD relationnelle sont aussi faite pour stocker des données binaires. (sinon pourquoi inventer les CLOB/BLOB...)
 
Il n'y a rien d'illogique où qui va à l'encontre des bonnes pratiques de faire ça.
Chaque solutions a ses avantages et inconvenients.
 
Va synchroniser un dossier d'images/de PDF avec un clusters de serveur PHP/Apache, et va synchroniser une BDD avec un cluster de MySQL/Oracle. Le second est bien plus simple à réaliser.
 
Sans compter les aspect de backup/restore/clone.
 
Etc.


---------------
| AMD Ryzen 7 3700X 8C/16T @ 3.6GHz - 32GB DDR4-3600 16-18-18 1T - AMD Radeon RX 5700 XT 8GB @ 2010MHz/14Gbps |
n°1998690
atout1
Etudiant
Posté le 03-06-2010 à 11:05:55  profilanswer
 

j'ai fais comme ça mais il m'affiche une erreur de syntax dans mysql  
voila mon code :
$commande = "./simulation/simulation_morphologique/nomFichier.zip";
$commande = file_get_contents($commande);
$insertion = mysql_query("INSERT INTO commande VALUES ('', '$commande')" ) or die(mysql_error());

n°1998692
Antac
..
Posté le 03-06-2010 à 11:07:17  profilanswer
 

J'exagère un peu dans mes propos, en fait cela peut avoir une utilité mais AMHA :
La gestion du cache du SGBD risque d'être quand même sacrément affecté
La charge en sélection risque d'être très importante au risque de ralentir la base entière (selon la taille du fichier)
La maintenance des fichiers contenus est plus difficile
Le risque de plantage en restauration si la table est corrompue est aussi plus délicate.
Dans le cas d'InnoDb, le tableSpace risque de devenir monstreux.
 
Maintenant je connais tout à fait les raisons qui peuvent pousser à faire cela et je les respecte      
(Données centralisées pour les backups, réplication et load balancing surtout).

Message cité 1 fois
Message édité par Antac le 03-06-2010 à 11:08:35
mood
Publicité
Posté le 03-06-2010 à 11:07:17  profilanswer
 

n°1998695
MEI
|DarthPingoo(tm)|
Posté le 03-06-2010 à 11:10:44  profilanswer
 

atout1 a écrit :

j'ai fais comme ça mais il m'affiche une erreur de syntax dans mysql  
voila mon code :
$commande = "./simulation/simulation_morphologique/nomFichier.zip";
$commande = file_get_contents($commande);
$insertion = mysql_query("INSERT INTO commande VALUES ('', '$commande')" ) or die(mysql_error());


 

Code :
  1. INSERT INTO table_name ({liste_de_colonnes})
  2. VALUES ({liste_de_valeurs);


 


---------------
| AMD Ryzen 7 3700X 8C/16T @ 3.6GHz - 32GB DDR4-3600 16-18-18 1T - AMD Radeon RX 5700 XT 8GB @ 2010MHz/14Gbps |
n°1998699
MEI
|DarthPingoo(tm)|
Posté le 03-06-2010 à 11:14:40  profilanswer
 

Antac a écrit :

J'exagère un peu dans mes propos, en fait cela peut avoir une utilité mais AMHA :
La gestion du cache du SGBD risque d'être quand même sacrément affecté
La charge en sélection risque d'être très importante au risque de ralentir la base entière (selon la taille du fichier)
La maintenance des fichiers contenus est plus difficile
Le risque de plantage en restauration si la table est corrompue est aussi plus délicate.
Dans le cas d'InnoDb, le tableSpace risque de devenir monstreux.
 
Maintenant je connais tout à fait les raisons qui peuvent pousser à faire cela et je les respecte      
(Données centralisées pour les backups, réplication et load balancing surtout).


L'influence des BLOB est quasi nulle en cas de select. Enfin dans un SGBD correct
 
En effet, les SGBD ont tendances a stocker tout les BLOB/CLOB dans un espaces à part. On peut prendre ça comme une tables BLOB avec une reference et le contenu du BLOB/CLOB.
 
Lors de l'insert, le SGBD ne va insérer que la référence du BLOB dans la colonne de la stable en question,. ce qui fait que pendant les select, on va recupérer seulement cette référence. Ce n'est que quand on va reellement lire le BLOB que ça va se ralentir.
 
Alors en PHP on a tendance a avoir des lib. qui lisent directement les BLOB, mais bon, après suffit de ne pas inclure le champs BLOB inutilement dans la requête.


---------------
| AMD Ryzen 7 3700X 8C/16T @ 3.6GHz - 32GB DDR4-3600 16-18-18 1T - AMD Radeon RX 5700 XT 8GB @ 2010MHz/14Gbps |
n°1998701
atout1
Etudiant
Posté le 03-06-2010 à 11:15:17  profilanswer
 

MEI a écrit :


 

Code :
  1. INSERT INTO table_name ({liste_de_colonnes})
  2. VALUES ({liste_de_valeurs);


 


 
$insertion = mysql_query("INSERT INTO commande VALUES ({'$id', '$date_creation', '$commande'})" ) or die(mysql_error());
message d'erreur :  
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''23', '2010-6-3', 'PK\0\0\0\0œYÃ<5`xbØ\0\0c\0\07\0\0\0./' at line 1

n°1998702
Antac
..
Posté le 03-06-2010 à 11:17:39  profilanswer
 

Code :
  1. $commande = "./simulation/simulation_morphologique/nomFichier.zip";
  2. $commande = file_get_contents($commande);
  3. $insertion = mysql_query("INSERT INTO commande (creation_date,commande) VALUES ($dateCreation,$commande) or die(mysql_error());


 
Utilise plutôt mysqli si tu peux.

n°1998704
MEI
|DarthPingoo(tm)|
Posté le 03-06-2010 à 11:18:06  profilanswer
 

Sans les {} ... oups me suis mal fait comprendre.
 
Et comme listé plus haut, met explicitement le nom des colonnes.
 
Après su peut aussi faire un $query temporaire contenant la requête SQL que tu génères ce qui te permettra de faire un print_r et de voir ce qui est réellement reçu pas mysql_query.
 
Peut être que le soucis est dans une des variables.


---------------
| AMD Ryzen 7 3700X 8C/16T @ 3.6GHz - 32GB DDR4-3600 16-18-18 1T - AMD Radeon RX 5700 XT 8GB @ 2010MHz/14Gbps |
n°1998706
atout1
Etudiant
Posté le 03-06-2010 à 11:23:54  profilanswer
 

toujours la même problème

n°1998708
Antac
..
Posté le 03-06-2010 à 11:26:27  profilanswer
 

fais une echo de ta requête, mets la dans un requetteur (PHPMyAdmin,SQLyog ou autre) et regarde l'erreur réelle


Message édité par Antac le 03-06-2010 à 11:26:54
n°1998826
rufo
Pas me confondre avec Lycos!
Posté le 03-06-2010 à 15:03:29  profilanswer
 

$insertion = mysql_query("INSERT INTO commande VALUES ('', '$commande')" ) or die(mysql_error());  
 
-> ça vient juste du fait que tu n'échappes pas certains caractères contenus dans ton fichier :/ T'aurais peut-être intérêt à le convertir en base64 comme ça, pas de pb de caractères (plus de charset, éventuellement)...
 
Mais je suis d'accord avec le fait que c'est pas une bonne idée de stocker un fichier en bd. Pour la synchro de répertoire, d'as des outils d'admin fait pour ça (rsync, par ex).


Message édité par rufo le 03-06-2010 à 15:04:27

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°1998828
MEI
|DarthPingoo(tm)|
Posté le 03-06-2010 à 15:07:07  profilanswer
 

C'est vrai que vaudrait mieux une API avec une syntaxe du type :

Code :
  1. execute_query('insert into command values (?)', array($commande));


 
Mais bon je sais pas si y'a des API BDD de ce genre en PHP à vrai dire...
Encore que de tête pour insérer du JPEG en SQLite/Oracle j'ai pas eu de soucis. Mais bon j'utilisai des classes en sur-couche de Zend_Db.


Message édité par MEI le 03-06-2010 à 15:07:53

---------------
| AMD Ryzen 7 3700X 8C/16T @ 3.6GHz - 32GB DDR4-3600 16-18-18 1T - AMD Radeon RX 5700 XT 8GB @ 2010MHz/14Gbps |
n°1998854
rufo
Pas me confondre avec Lycos!
Posté le 03-06-2010 à 16:00:05  profilanswer
 

si, la lib PDO pour les requêtes préparées.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°1998860
atout1
Etudiant
Posté le 03-06-2010 à 16:03:13  profilanswer
 

merci pour vos réponses je veux tester ce ke ma dis rufo ,  
et je vous dis après les résultats . Merci  
 
A+

n°1998999
atout1
Etudiant
Posté le 04-06-2010 à 09:03:09  profilanswer
 

bonjour tt le monde  
 
mnt je pense que j'ai réussi à insérer le .zip dans la base de données voila le code :
$commande = "./simulation/simulation_morphologique/$nom/$nom.zip";
$commande = file_get_contents($commande);
$commande = base64_encode($commande);  
$insertion = mysql_query("INSERT INTO commande VALUES ('$nom', '$date_creation', '$utilisateur', '$type', '$commande')" ) or die(mysql_error());

 
mais j'arrive pas a le récupérer ??
actuellement je fais comme ça  
 
$reponseCommande = mysql_query("SELECT * FROM commande WHERE id_commande = $id]" ) or die (mysql_error());
$donneesCommande = mysql_fetch_array($reponseCommande));
$donneesCommande = base64_decode($donneesVisu['commande']);
 
echo "<br/><a href='$donneesCommande'>Télécharger la commande</a>"; // ici il afficher le code binaire (comment faire reproduire le fichier .zip à partir de ce code binaire)

n°1999002
grosbin
OR die;
Posté le 04-06-2010 à 09:10:59  profilanswer
 

Arf .. tu gagnerais 70h à enregistrer juste l'emplacement physique de ton zip ..


---------------
Développeur Php Annecy
n°1999009
atout1
Etudiant
Posté le 04-06-2010 à 09:37:07  profilanswer
 

grosbin a écrit :

Arf .. tu gagnerais 70h à enregistrer juste l'emplacement physique de ton zip ..


 
j'ai pas compris :D

n°1999010
rufo
Pas me confondre avec Lycos!
Posté le 04-06-2010 à 09:39:56  profilanswer
 

stockes le fichier récupéré dans un répertoire temporaire ou utilise header() pour forcer le téléchargement (ouverture de la boîte de dialogue "télécharger" du navigateur).
 
ps : pas une très bonne idée d'avoir un champ qui a le même nom que la table dans laquelle il se trouve. Je fais référence au champ "commande" de la table "commande" :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°1999033
grosbin
OR die;
Posté le 04-06-2010 à 10:22:46  profilanswer
 

//ton traitement sql qui donne le chemin de ton fichier zip sur ton serveur
$path="chemin du fichier zip";
header("Content-Type: application/force-download" );readfile($path);exit;
//si je comprend ton objectif serait de ne pas dévoiler l'adresse du fichier zip ( pour éviter téléchargement public etc .. )


---------------
Développeur Php Annecy
n°1999044
atout1
Etudiant
Posté le 04-06-2010 à 10:35:06  profilanswer
 

grosbin a écrit :

//ton traitement sql qui donne le chemin de ton fichier zip sur ton serveur
$path="chemin du fichier zip";
header("Content-Type: application/force-download" );readfile($path);exit;
//si je comprend ton objectif serait de ne pas dévoiler l'adresse du fichier zip ( pour éviter téléchargement public etc .. )


 
en fait mon fichier se trouve dans la base de données, une fois je l'insère dans la base de données je le supprime du répertoire.
mnt je veux reproduire le zip à partie du code code isnérer dans ma base de données pour pouvoir le télécharger ?????


Message édité par atout1 le 04-06-2010 à 14:45:17
n°1999160
atout1
Etudiant
Posté le 04-06-2010 à 16:56:29  profilanswer
 

ça y est j'ai trouve yupiiiiiiiiii , merci pour les pistes que vous m'avez donné :)
 
 
voici le lien de téléchargement :
<a href='telecharger_zip.php?id=$donnees[id]'>Télécharger</a>
 
telecharger_zip.php :
 
$id = $_GET['id'];
 
$req = mysql_query("SELECT * FROM commande WHERE id_commande=$id" ) or die(mysql_error());
$reponse = mysql_fetch_array($req);
 
$commande = $reponse['commande']; // colonne où se trouve le fichier .zip
header("Content-type: application/zip" );
header("Content-Disposition: attachment; filename=$reponse[id_commande].zip" );
 
echo ($reponse['commande']);

n°1999161
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 04-06-2010 à 17:00:13  profilanswer
 

atout1 a écrit :

ça y est j'ai trouve yupiiiiiiiiii , merci pour les pistes que vous m'avez donné :)
 
 
voici le lien de téléchargement :
<a href='telecharger_zip.php?id=$donnees[id]'>Télécharger</a>
 
telecharger_zip.php :
 
$id = $_GET['id'];
 
$req = mysql_query("SELECT * FROM commande WHERE id_commande=$id" ) or die(mysql_error());
$reponse = mysql_fetch_array($req);
 
$commande = $reponse['commande']; // colonne où se trouve le fichier .zip
header("Content-type: application/zip" );
header("Content-Disposition: attachment; filename=$reponse[id_commande].zip" );
 
echo ($reponse['commande']);


Oui mais y'a une faille de sécurité grosse comme ma bite là :/


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°1999162
atout1
Etudiant
Posté le 04-06-2010 à 17:13:33  profilanswer
 

WiiDS a écrit :


Oui mais y'a une faille de sécurité grosse comme ma bite là :/


 
cé ou ? et comment le corriger ?? Merci

n°1999167
rufo
Pas me confondre avec Lycos!
Posté le 04-06-2010 à 17:17:56  profilanswer
 

je dirais même 2 failles :
1) passage presque en direct de l'ID dans la requête à partir de $_GET. Si c'est un simple numéro incrémental, ça va être facile de récupérer n'importe quel fichier
2) faire un echo du contenu du fichier pour faire exécuter du code (ex : si ton fichier contient du javascript, php...)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°1999174
atout1
Etudiant
Posté le 04-06-2010 à 17:32:16  profilanswer
 

rufo a écrit :

je dirais même 2 failles :
1) passage presque en direct de l'ID dans la requête à partir de $_GET. Si c'est un simple numéro incrémental, ça va être facile de récupérer n'importe quel fichier
2) faire un echo du contenu du fichier pour faire exécuter du code (ex : si ton fichier contient du javascript, php...)


 
en fait quand tu clique sur le lien de téléchargement tu accède directement au fenêtre de téléchargement donc tu ne peux pas modifier l'ID.  
pour mes fichiers sont des fichiers text.  
 

n°1999217
omega2
Posté le 04-06-2010 à 21:05:43  profilanswer
 

atout1 a écrit :


 
en fait quand tu clique sur le lien de téléchargement tu accède directement au fenêtre de téléchargement donc tu ne peux pas modifier l'ID.  
pour mes fichiers sont des fichiers text.  
 

"Clic droit", "copier l'adresse du lien" [:airforceone] je colle l'adresse dans la barre d'adresse du navigateur, je change le numéro et je valide. Et  [:mesh] j'ai un autre fichier. Et ce n'est que la méthode la plus simple pour récupérer le lien et le modifier. Il en existe bien d'autres et tu ne pourras jamais toutes les empêcher.
En php tout simple par exemple, je peux faire en 2 minutes un script qui téléchargera tous les fichiers de ta base si les numéros sont incrémentaux. J'irais même jusqu'à dire que c'est même à la porté de tout débutant en php.  Si je passe 5 minutes là dessus j'ai même le temps de mettre une condition d'arrêt pour que le script s'arrête quand il tombe sur un certain nombre de cas d'erreurs successif (pour ne pas qu'il stoppe au premier fichier supprimé de la base ou que je soit obligé de le surveiller) Le plus dur là dedans, ça reste encore de taper la bonne ligne de commande pour ne pas être bloqué par la limite des 30 secondes.
 
Si tu rajoutes une protection avec valeur dans la session ou dans le cookie ou en vérifiant le Http-referer, alors c'est au pire une demis journée de plus * avant de pouvoir tout pomper. Et encore je vise large. Avec les classes que j'ai déjà sous la main, je fais tomber ce temps là sous la barre de la demis heure et pour remercier le gentil développeur de tout ces fichiers, je lui envoie une analyse des logs que je me suis constitué au passage pour qu'il puisse savoir quels sont les fichiers les plus longs à récupérer ainsi que la vitesse moyenne de téléchargement que j'ai obtenu. [:anathema]  
 
Voilà à quoi tu t'exposes avec une absence de protection aussi flagrante et ne pense pas que les délais que j'ai écris sont de la vantardise, c'est juste que j'ai quelques années d'expériences derrière moi et que j'ai fait récemment un analyseur de site web.
 
* cas du captcha non inclus ;)


Message édité par omega2 le 04-06-2010 à 21:07:36
n°1999327
rufo
Pas me confondre avec Lycos!
Posté le 06-06-2010 à 10:52:11  profilanswer
 

l'ID de ton fichier devait être une clé calculée genre un truc à base de md5 incluant, par ex, la date d'upload du fichier, le nom du fichier et un nb aléatoire comme fait megaupload (je ne fais pas référence aux paramètres du md5, mais à une clé complexe du genre "MX4GH3" ), par ex ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°1999439
atout1
Etudiant
Posté le 07-06-2010 à 08:54:29  profilanswer
 

rufo a écrit :

l'ID de ton fichier devait être une clé calculée genre un truc à base de md5 incluant, par ex, la date d'upload du fichier, le nom du fichier et un nb aléatoire comme fait megaupload (je ne fais pas référence aux paramètres du md5, mais à une clé complexe du genre "MX4GH3" ), par ex ;)


 
merci je veux faire ça ... bonne idée

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Insérer un fchier .zip dans BD mysql en PHP

 

Sujets relatifs
mysql_insert_id() expects parameter 1 to be resourceImage dans un champ BLOB sous MySQL ???
Stocker images et .zip dans une BD via PHPproblème avec la commande exec [PHP]
[Debutant] Python + MYSQL Python, erreur syntaxe dans requette MYSQLSessions PHP
[RESOLU][MySQL] requete toute simpleProblème formulaire HTML& PHP
[resolu][PHP] parcourir un tableau d'objet 
Plus de sujets relatifs à : Insérer un fchier .zip dans BD mysql en PHP


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR