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

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

Marsh Posté le 03-06-2010 à 10:05:07    

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+

Reply

Marsh Posté le 03-06-2010 à 10:05:07   

Reply

Marsh Posté le 03-06-2010 à 10:06:20    

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

Reply

Marsh Posté le 03-06-2010 à 10:30:23    

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


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 03-06-2010 à 10:33:09    

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

Reply

Marsh Posté le 03-06-2010 à 10:40:03    

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


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 03-06-2010 à 10:44:25    

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


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 03-06-2010 à 10:48:59    

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
Reply

Marsh Posté le 03-06-2010 à 10:54:18    

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 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 03-06-2010 à 11:05:55    

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());

Reply

Marsh Posté le 03-06-2010 à 11:07:17    

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
Reply

Marsh Posté le 03-06-2010 à 11:07:17   

Reply

Marsh Posté le 03-06-2010 à 11:10:44    

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 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
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 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
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

Reply

Marsh Posté le 03-06-2010 à 11:17:39    

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.

Reply

Marsh Posté le 03-06-2010 à 11:18:06    

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 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 03-06-2010 à 11:23:54    

toujours la même problème

Reply

Marsh Posté le 03-06-2010 à 11:26:27    

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
Reply

Marsh Posté le 03-06-2010 à 15:03:29    

$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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-06-2010 à 15:07:07    

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 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 03-06-2010 à 16:00:05    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-06-2010 à 16:03:13    

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

Reply

Marsh Posté le 04-06-2010 à 09:03:09    

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)

Reply

Marsh Posté le 04-06-2010 à 09:10:59    

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


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 04-06-2010 à 09:37:07    

grosbin a écrit :

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


 
j'ai pas compris :D

Reply

Marsh Posté le 04-06-2010 à 09:39:56    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-06-2010 à 10:22:46    

//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 .. )


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 04-06-2010 à 10:35:06    

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
Reply

Marsh Posté le 04-06-2010 à 16:56:29    

ç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']);

Reply

Marsh Posté le 04-06-2010 à 17:00:13    

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
Reply

Marsh Posté le 04-06-2010 à 17:13:33    

WiiDS a écrit :


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


 
cé ou ? et comment le corriger ?? Merci

Reply

Marsh Posté le 04-06-2010 à 17:17:56    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-06-2010 à 17:32:16    

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.  
 

Reply

Marsh Posté le 04-06-2010 à 21:05:43    

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
Reply

Marsh Posté le 06-06-2010 à 10:52:11    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-06-2010 à 08:54:29    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed

© 2018 Forum. All Rights Reserved.