IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Décodage de fichiers (pdf, doc, xls, txt, etc.) encodés en Base64 dans une base de données MySQL [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Antarctique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2018
    Messages : 12
    Par défaut Décodage de fichiers (pdf, doc, xls, txt, etc.) encodés en Base64 dans une base de données MySQL
    Bonjour,

    Je dois ajouter à un projet php, qui a été développé par une tierce partie il y a plusieurs temps de ça, la fonctionalité d'aller récupérer une chaîne de caractère encodée en Base64 contenant un document quelquonque (pdf, doc, xls, txt, etc...) dans une base de données MySQL, décoder cette chaîne de caractère afin qu'elle devient le fichier qu'elle représente et en dernier lieu, créer un lien permettant de télécharger ce fichier. La table (de la base de données) contenant la chaîne de caractère encodé en Base64, possède le nom original du fichier qui a été encodé et doit être utilisé pour le nom du lien (ex: nom_du_fichier.pdf).

    Ma première tentative à été de bidouiller un bout de code qui:
    - va chercher la chaîne de caractère en Base64 et le nom associé au fichier dans la base de données
    - je passe ces deux valeurs à des variables: $fichier_encode64 et $nom_fichier_encode64
    - je passe la chaîne de caratère à la fonction base64_decode() qui passe la valeur retournée à la variable $fichier_decode64
    - le tout est outputé sur la page ainsi: <?php echo "<a href='" . $fichier_decode64 . "'>" . $nom_fichier_encode64 . "</a>"; ?>

    Lorsqu'on clique sur le lien, il charge la longue chaîne de caractère représentant le fichier plutôt que de télécharger le fichier. J'ai trouvé 2 posts qui donnent quelques indications sur comment s'y prendre dans des cas particuliers mais rien de général à plusieurs type de fichiers.

    Est-ce qu'il y a quelqu'un qui s'y connaît dans la matière? Toutes vos suggestions sont les bienvenues.

    Merci.

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Déjà tu t'y prends mal. Ce n'est pas en mettant le contenu du fichier dans un href que tu auras ton fichier.

    A ta place je ferais un lien du genre <a href='ma_page.php?fichier=toto.pdf'>toto.pdf</a> où toto.xls est le nom du fichier qui vient de ta table.

    Dans ma_page.php je rechercherais le contenu dans la table en fonction du paramètre fichier (après avoir fait tous les contrôles de sécurité), ferais la conversion depuis la base 64 et renverrais la page via un header adéquat.

    Dans l'exemple ci-dessous je ne gère que les pdf mais tu peux renvoyer le bon header en fonction de l'extension. Si l'extension = pdf alors tel header sinon si extension = xls alors tel autre header etc...
    Il faut aussi gérer les erreurs comme une extension inconnue, un nom de fichier qui n'existe pas dans la table, le nom de fichier qui n'est pas passé, etc...

    ma_page.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
     
    //---- DATABASE
    define('DB_HOST', '127.0.0.1');
    define('DB_NAME', 'tests');
    define('DB_USER', 'root');
    define('DB_PWD' , '');
    $filename = $_GET['fichier'];
     
    $bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $query     = "SELECT document from document where nom_fichier=:nom_fichier";
    $prepared  = $bdd->prepare($query);
    $prepared->bindParam(':nom_fichier', $filename );
    $prepared->execute();
    header('Content-Type: application/pdf');
    header("Content-Disposition: attachment; filename=\"$filename\"");
    $row = $prepared->fetch(PDO::FETCH_ASSOC);
    print base64_decode($row['document']);

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Antarctique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2018
    Messages : 12
    Par défaut
    Merci pour ton retour. Actuellement, la requête du fichier encodé se fait après avoir cliqué un lien d'accès se trouvant dans un tableau, comme ceci:

    COLLECTEUR DATE ASSIGNATION NO. DE COMPTE NOM DU DÉBITEUR STATUT TYPE NB. DE MISE À JOUR ACCÉDER
    John Smith 2018-12-08 2734561 Jane Smith Actif Bancaire 3 ->
    Neo Smith 2018-12-08 2730561 Julie Smith Actif Bancaire 7 ->

    Ces données représentent les infos de haut niveau d'un dossier client, une fois que la flèche sous la colonne - ACCÉDER - est cliqué, on passe un numéro de dossier dans l'url (ex: details.php?dossier=1234567) qui envoi une requête SQL (SELECT * FROM dossier_client WHERE no_dossier = GET['dossier']) qui retourne les infos détaillées du dossier client. Sur cette page détaillée se trouve plusieurs informations parmi lesquelles peut ou pas se retrouver un ou plusieurs fichiers qui seront listés dans un tableau et si désiré, téléchargé lorsque le nom du fichier est cliqué:

    FICHIERS DATE
    fichier_1.pdf 2018-12-08
    fichier_2.docx 2018-12-07
    fichier_3.xls 2018-12-03

    En me basant sur ta suggestion, vais-je devoir créer un nouveau header pour chaque fichier qui sera dans le tableau?

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Oui. Ton lien fera toujours référence à la même page. Seul le paramètre nom du fichier change. Après passer d’un type de header à un autre en fonction du type de fichier ne représente aucune difficulté et les informations sont facilement disponibles.

    Par contre il faut tout sécuriser pour qu’on ne puisse prendre le script en défaut.

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Antarctique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2018
    Messages : 12
    Par défaut
    Parfait. Merci pour la précision. Je vais implémenter et adapter ton exemple de code dans une fonction qui sera appeler quand le lien du fichier (details.php?fichier=fichier_1.pdf) sera cliqué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if(isset($_GET['fichier'])){
     
    	$filename = $_GET['fichier'];
    	$bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    	$query     = "SELECT document from document where nom_fichier=:nom_fichier";
    	$prepared  = $bdd->prepare($query);
    	$prepared->bindParam(':nom_fichier', $filename );
    	$prepared->execute();
     
    	$extension = substr(strrchr($filename, "."), 1);
    	header("'Content-Type: application/" . $extension . "'");
    	header("Content-Disposition: attachment; filename=\"$filename\"");
     
    	$row = $prepared->fetch(PDO::FETCH_ASSOC);
    	print base64_decode($row['document']);
    }
    Je te garde au courant si tout a fonctionné.

  6. #6
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Il faut que tu fasses une recherche sur le content-type des différents types de fichiers. Ils n’ont pas tous la même structure.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Upload de fichier dans une base de données MySQL
    Par miko2009 dans le forum W4 Express
    Réponses: 1
    Dernier message: 07/01/2009, 19h16
  2. Réponses: 2
    Dernier message: 21/07/2008, 15h00
  3. Réponses: 1
    Dernier message: 30/12/2007, 14h51
  4. importer une fichier excel dans une base de donnée MySQL
    Par maverick56 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 29/05/2007, 09h15
  5. Intégration des fichier XML dans une base de données MySQL
    Par bebemoundjou dans le forum XQUERY/SGBD
    Réponses: 8
    Dernier message: 25/11/2005, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo