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 :

LONGBLOB en fichier sans stockage intermédiaire


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut LONGBLOB en fichier sans stockage intermédiaire
    J'ai regardé sur gogole rien trouvé mais je suis peut etre passé à coté.


    J'ai un champ LONGBLOB, dednas sont stockés tous mes fichiers.

    Je voudrais sans avoir à générer les fichiers sur le serveur que les poste clients récupèrent le fichier sur un clic de lien.
    C'est illogique je sais car pour récupérer un fichier et bien il faut qu'il y en ait un deja en effet.

    Est ce alors possible de recupérer le contenu du LONGBLOB et que sur le poste client cela propose l'ouverture avec les logiciels présents sur le poste client ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Est ce alors possible de recupérer le contenu du LONGBLOB
    Tu as juste a envoyer le fichier vers la sortie standard avec un echo de son contenu.
    Il faudra aussi spécifier le type de document
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: image/jpeg');
    et que sur le poste client cela propose l'ouverture avec les logiciels présents sur le poste client
    C'est le navigateur qui décide ce que devient le fichier.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Tu as juste a envoyer le fichier vers la sortie standard avec un echo de son contenu.
    La fonction header attend un fichier si je me plante pas mais moi c'est directement le contenu d'un longblob (et encore il est en binaire donc faut le transformer).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
    C'est possible de remplacer le nom de fichier par une variable qui elle contient le contenu du fichier ?

    Pour le type de fichier, il sera déterminé dynamiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: application/.'$type'.');
    Je t'avouerais que je suis bloqué sur la conversion binaire aussi...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $file = $recupere_doc['Nom_Doc'];
     
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);

    L'erreur à chaque fois est :
    Warning: readfile(nom_fichier.txt) [function.readfile]: failed to open stream: No such file or directory in C:\Program Files (x86

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est possible de remplacer le nom de fichier par une variable qui elle contient le contenu du fichier ?
    Le header sert a donner des informations sur le contenu qui va suivre, il ne contient pas le contenu (sinon ca ne serait plus un en-tête). Le filename ici est seulement l'indication du nom du fichier.

    Warning: readfile(nom_fichier.txt)
    Il n'y a pas de readfile() dans ce que je t'ai proposé.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Je bloc sur l'alimentation de mon fichier.

    ok pour un echo de mon BLOB mais après...
    Je n'arrive pas à trouver dans quel paramètre on transmet le contenu...

    Désolé je fais mon boulet la....

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Fais le echo, tu vas comprendre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Voila mon code :
    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
    18
    19
    20
    21
     switch ($recupere_doc['Type_Doc']) {
                    case "PDF": $ctype="application/pdf"; break;
                    case "DOCX": $ctype="application/msword"; break;
                    case "LOG": $ctype="application/msword"; break;				
                    case "XLS": $ctype="application/vnd.ms-excel"; break;
                    case "PPT": $ctype="application/vnd.ms-powerpoint"; break;
                    default: $ctype="application/force-download";
                }
     
     
    			$file = $recupere_doc['Nom_Doc'];
    			echo $recupere_doc['Contenu_Doc'];
    			header('Content-Description: File Transfer');
    			header("Content-Type: $ctype");
    			header('Content-Disposition: attachment; filename='.basename($file));
    			header('Content-Transfer-Encoding: binary');
    			header('Expires: 0');
    			header('Cache-Control: must-revalidate');
    			header('Pragma: public');
    			ob_clean();
    			flush();
    Il m'affiche dans la page le contenu du LONGBLOB, il ne prend pas en compte mon header

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Le echo va après les headers.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Quel boulet je fais....

    En fait mes instructions étaient mises après plusieurs auters traitements donc forcément ca marchait moins bien ^^

    Vraiment merci en tout cas pour ton aide.

    Il me reste un soucis... Quand j'ouvre le fichier téléchargé avec word il y a une erreur, au final il me génère un image ^^
    Cela doit venir de la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Transfer-Encoding: binary');
    Est ce qu'il y a un type générique pour les formats doc/docx/pdf... ?
    Style text/plain ou un truc du genre.

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    .doc application/msword
    .docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
    .docm application/vnd.ms-word.document.macroEnabled.12
    .xls application/vnd.ms-excel
    .xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    .xlsm application/vnd.ms-excel.sheet.macroEnabled.12
    .ppt application/vnd.ms-powerpoint
    .pps application/vnd.ms-powerpoint
    .pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Cela fonctionne bien pour les .log par contre mes .docx sont ouverts "corrompus", les images contenues dedans étant manquantes...

    Ai je oublié quelque chose ??

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Hormis les fichiers .txt simples, aucun autre fichier ne passe...
    Voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    header("Content-Type: $ctype" );
    //header("Content-type: application/force-download");
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Description: File Transfert" );
    header("Content-Transfer-Encoding: binary" );
    header("Pragma: no-cache" );
    header('Content-Length: ' . filesize($file));
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
    header("Expires: 0" );
    ob_clean();
    flush();
    echo $recupere_doc['Contenu_Doc'];
    J'ai regardé partout, selon les exemples que j'ai vu cela devrait fonctionner...
    En base c'est un champs type image, est ce que cela viendrait de ca ?

    Edit:
    Je vérifie coté serveur si je n'ai pas de limitation, les fichiers que je récupère font 35Ko max tous....

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    J'ai effectué plusieurs tests.

    En utilisant un fopen , j'ai créé le fichier puis rempli avec le contenu du champ image.
    J'ai testé plusieurs méthodes et le résultat est le même...

    Fichier corrompu dès qu'il y a une mise en forme, sur un texte .txt simple ca passe.

    Il faut faire un décode de mon champ ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Après X tests :

    - Si un fichier docx présent sur le serveur : affichage ok avec readfile()
    - Si on affiche le champ blob via un header/echo : erreur fichier corrompu, le texte est présent mais pas d'images.
    - Si je génère un fichier docx/pdf avec un fopen/fwrite : erreur fichier corrompu, le texte est présent mais pas d'images.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 25
    Par défaut
    Je reçois un flux au format hexa:
    Il y a une conversion à faire ?

Discussions similaires

  1. Récupérer un nom de fichier sans extension
    Par OxN dans le forum Général Java
    Réponses: 13
    Dernier message: 01/08/2011, 16h13
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. Réponses: 3
    Dernier message: 27/05/2009, 13h44
  4. [langage] Trouver les fichiers sans la case
    Par nledez dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2004, 12h07
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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