LONGBLOB en fichier sans stockage intermédiaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : LONGBLOB en fichier sans stockage intermédiaire

Re: LONGBLOB en fichier sans stockage intermédiaire

par Mazarini » 25 juin 2013, 15:23

Oui, en prenant les caractères 2 par 2, mais ca risque d'être très long.

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 25 juin 2013, 15:11

Tu veux dire faire un boucle qui récupère 1 à 1 les octets et converti en binaire ensuite ?

Re: LONGBLOB en fichier sans stockage intermédiaire

par Mazarini » 25 juin 2013, 14:59

En désespoire de cause par 2 caractères :
chr(hexdec(substr($x,$i,2))))
mais ca va être long.

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 25 juin 2013, 14:54

Ma version de php sur le serveur est 5.2.8... donc non compatible avec cette fonction.

Re: LONGBLOB en fichier sans stockage intermédiaire

par Mazarini » 25 juin 2013, 14:48

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 25 juin 2013, 14:31

Je reçois un flux au format hexa:

Code : Tout sélectionner

0x504B0304140006....
Il y a une conversion à faire ?

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 25 juin 2013, 11:00

Je ne sais plus quoi faire la...

Toutes les méthodes utilisées (principalement fopen/header) donnent le meme résultat et pourtant j'en ai tenté beaucoup, pour ainsi dire toutes celles du web...

Mes docx contiennent mon texte mais les images ne s'affichent pas (pas encore essayé pdf).
Les fichiers .log s'affichent sans aucun soucis eux.

J'ai varié entre les options obligatoires et facultatives, au final j'ai ca :

Code : Tout sélectionner

$contenu= $recupere_doc['Contenu_Doc']; $file = $recupere_doc['Nom_Doc']; ob_start(); header("Content-Type: $ctype" ); header("Content-Disposition: attachment; filename=$file"); header("Content-Transfer-Encoding: binary" ); header("Pragma: no-cache" ); header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" ); header("Expires: 0" ); echo $contenu; ob_flush(); flush(); ob_end_clean();
Je peux commenter/décommenter les paramètres facultatifs cela ne change rien.
Le contenu de mon champ contenu n'est pas en binaire et je pense que le problème vient de la...
Quel est le format de données qu'il faut pour que le header fonctionne ? du binaire ?
Surtout entre ce que je vois en base et ce qui apparait quand je fais un echo cela n'a rien à voir, et sans faire de transformation.

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 24 juin 2013, 16:05

Les docx corrompus ("des problèmes ont été décélés dans son contenu") quand je les ouvre n'ont pas d'image, elles ont toutes une croix. Le texte par contre est présent.

Si j'avais un problème de format, le texte ne s'afficherait pas non plus non ?

ps: Je viens de voir qu'en base c'est de l'hexadécimal... oui je n'ai pas accès à la base.

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 24 juin 2013, 15:13

J'ai beau tout essayer le contenu de l'echo ne change pas, j'ai ajouté dans ma requete :

Code : Tout sélectionner

CAST(Contenu_Doc AS varbinary(max)) AS [Contenu_Doc]
J'ai essayé avec ca aussi :

Code : Tout sélectionner

CONVERT(varbinary(max), Contenu_Doc) AS [Contenu_Doc]
L'echo m'affiche toujours exactement la meme chose et toujours la même erreur si j'ouvre le fichier...

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 24 juin 2013, 14:52

J'ai essayé ca ne fonctionne pas.

Mais je pense en effet qu'il y a un probleme de conversion.

Quand je regarde en base c'est du binaire, quand je fais un echo ce n'est plus du binaire...

il y a des fonctions pour convertir du binaire en hexa mais pas pour faire binaire -> binaire...

Re: LONGBLOB en fichier sans stockage intermédiaire

par Mazarini » 24 juin 2013, 14:29

J'ai trouvé une script : http://www.webdeveloper.com/forum/showt ... le-from-db
mssql_query("SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;");  
$zapytanie = "SELECT TOP 1 Name, Img  
                    FROM Photos2 
                    "; 
    $wynik = mssql_query ($zapytanie) or die ("blad w zapytaniu mysq"); 

    $rekord = mssql_fetch_array($wynik); 

    $obrazek = $rekord[1]; 

    $obrazek = str_replace('\0', "\0", $obrazek); 
    $obrazek = str_replace('\'\'', "'", $obrazek); 

    echo $obrazek;  
A priori, il te manque 3 lignes :
mssql_query("SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;");
et
$obrazek = str_replace('\0', "\0", $obrazek);
$obrazek = str_replace('\'\'', "'", $obrazek);

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 24 juin 2013, 14:07

Oui cela doit venir de la, en base c'est en binaire et quand je fais un echo des fichiers docx/pdf et autres (sauf .log/.txt, ) je n'ai pas la même que que ce qu'il y a en base...

Je n'utilise pas PDO et arrivé au point ou j'en suis du dev (je continue un pré existant) je ne peux pas changer.

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 24 juin 2013, 13:35

Tu as la meme chose avec mssql ? ^^

Je récupère comme cela :

Code : Tout sélectionner

$recup_doc="SELECT * from table WHERE ID_Doc='$get_doc'"; $req_doc= mssql_query($recup_doc,$dblink) or die(mssql_error()); while($recupere_doc=mssql_fetch_assoc($req_doc)){ (instructions header) }

Re: LONGBLOB en fichier sans stockage intermédiaire

par Mazarini » 24 juin 2013, 13:30

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.
Pour moi, ca veut dire qu'il se passe quelque chose lors de la récupération de $recupere_doc['Contenu_Doc']. Comme cela marche avec delphi, je suppose que le stockage es ok et que c'est la lecture qui merde.

Comment fais tu la lecture ?
Tu peux regarder :
PDO::SQLSRV_ENCODING_BINARY (entier)
Spécifie que cette donnée est envoyée vers le (ou reçue du) serveur comme un flux d'octets, sans opérer d'encodage ou de traduction. Cette constante peut être utilisée dans les appels à PDOStatement::setAttribute, PDO::prepare, PDOStatement::bindColumn, et PDOStatement::bindParam.
source : http://php.net/manual/fr/ref.pdo-sqlsrv.php

Re: LONGBLOB en fichier sans stockage intermédiaire

par morhead » 24 juin 2013, 12:15

Pour résumer :

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.