Problème ouverture PDF champ BLOB MySql

GetsugaTensho37
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 09:47

Bonjour à tous,

J'enregistre en base dans un champ "longblob" un fichier "pdf". Le fichier est enregistré dans de la manière suivante :

- Je liste les fichiers présents dans un répertoire
- l'utilisateur clique sur le bouton "Enregistrer" en face du fichier qui l'intéresse (j'ai le nom du fichier + extension)
- insertion en base

Pour l'ouverture, j'ai un lien qui pointe vers une page "ouv_pdf.php" contenant le code suivant :

Code : Tout sélectionner

header ( "Content-Type: application/pdf" ); // Fichiers requis require ("../../config_inc.php"); // Requête permettant de récupérer les répertoires de dépôts $query_pdf = "select donnees from fichedoc where fichedocid = '$_GET[fichedocid]'"; $result_pdf = mysql_query($query_pdf) or die ('Erreur dans la requête : ' . $query_pdf . '<br>Avec l\'erreur : ' . mysql_error()); $row_pdf = mysql_fetch_array($result_pdf); $pdf = stripslashes ( $row_pdf['donnees'] ); echo $pdf ;
Le lecteur acrobat se lance bien mais j'ai le message d'erreur suivant :

"Le fichier ne commence pas par %PDF-"


Une idée ?

Merci.

ViPHP
xTG
ViPHP | 7331 Messages

17 févr. 2011, 10:51

Bon pour la lecture je vois un stripslashes() qui fait bien moche dans le code...
Pourrais-t-on voir ton code d'insertion ?
As-tu essayé d'afficher le contenu à insérer et le contenu après insertion pour comparer ?

GetsugaTensho37
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 13:56

Bon pour la lecture je vois un stripslashes() qui fait bien moche dans le code...
Pourrais-t-on voir ton code d'insertion ?
As-tu essayé d'afficher le contenu à insérer et le contenu après insertion pour comparer ?
Ok pour le stripslahes, désolé !
C'est mon script d'insertion qui doit déconner car lorsque j'insére en enregistrement directement via PhpMyAdmin en choisissant le fichier pour le champ Blob, ça fonctionne.
Le principe de l'application est le suivant :

L'utilisateur upload son document, celui-ci est stocké sur un répertoire de "depot". Ensuite, l'utilisateur clique sur la liste des documents en instance d'enregistrement (répertoire dépot, fichiers pdf uploadés) puis il enregistre celui qui veut en base et tout un tas de processus et de contrôle pour indexer une fiche documentaire associé au pdf se déclenche. C'est ici que j'ai un problème, je viens de percuter en écrivant le message, j'ai juste le nom du PDF à ce moment là (toto.pdf) mais il est bien présent physiquement sur le serveur (répertoire dépot) et c'est ça que j'insère en base... Comment faire pour insérer son contenu ?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 févr. 2011, 14:02

yop

file_get_contents ?

perso je trouve pas que cela soit une bonne idée vu, qu'en général sur les serveur mutualisés, la taille des bases est plus limitées que l'espace disque et que la tu va polluer ta base avec un contenu qui pourrait être sur le disque ;)

@+
Il en faut peu pour être heureux ......

GetsugaTensho37
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 14:32

yop

file_get_contents ?

perso je trouve pas que cela soit une bonne idée vu, qu'en général sur les serveur mutualisés, la taille des bases est plus limitées que l'espace disque et que la tu va polluer ta base avec un contenu qui pourrait être sur le disque ;)

@+
Je vais tester avec "file_get_contents", merci.
Pour le reste, je suis entirèrement d'accords mais on me demande de tester cette piste. Actuellement les pdf sont stockés physiquement sur le serveur et en base je n'ai que le chemin. Mais comme nous tous, j'ai des chefs ! Ce qui dérange, c'est que des utilisateurs mettent en favoris des liens pointant directement vers le pdf et lorsqu'il y a une mise à jour de version d'un doc, leur favoris n'est plus bon.

Merci.
@+ tard

ViPHP
ViPHP | 2577 Messages

17 févr. 2011, 14:38

Bonjour,

Tu peux regarder du coté de mysqli_stmt_bind_param()

GetsugaTensho37
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 15:05

yop

file_get_contents ?

perso je trouve pas que cela soit une bonne idée vu, qu'en général sur les serveur mutualisés, la taille des bases est plus limitées que l'espace disque et que la tu va polluer ta base avec un contenu qui pourrait être sur le disque ;)

@+
Ca ne fonctionne pas avec file_get_contents, champ "blob" vide.
Lorsque je souhaite afficher la valeur, elle est vide.

Code : Tout sélectionner

$test = file_get_contents("$rep_depot_pdf/$nomficpdf"); echo "Test : " . $test . "<br />";
Plus d'idée ...

ViPHP
ViPHP | 5462 Messages

17 févr. 2011, 15:20

sans mettre de header dans ton premier code y'a bien un résultat qui s'affiche ?

Getsuga
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 15:57

sans mettre de header dans ton premier code y'a bien un résultat qui s'affiche ?
Non, il n'y avait rien. J'ai effectué le test suivant. J'ai créé un script php hors de l'application, juste pour faire mes tests :

Code : Tout sélectionner

require ("config_inc.php"); $data = file_get_contents("fichier.pdf"); //echo $data."<br />"; $query = "INSERT INTO fichedoc (fichedocid, espaceid, classeid, formatid, auteurid, datecreation, dateenreg, volarcpdfid, volarcnatifid, nomficpdf, nomficnatif, confidentiel, donnees) VALUES ('', '37', '9', '0', '', CURRENT_DATE(), CURRENT_DATE(), '1', '1', '', '','',mysql_real_escape_string($data))" ; $result = mysql_query($query) or die ('Erreur dans la requête : ' . $query . '<br>Avec l\'erreur : ' . mysql_error());
Il me dit que j'ai une erreur sql sur le champ "$data". Ca affiche pleins de caractères bizarres (le résultats du file_get_contents).

Si tu as une idée, je suis preneur.
Merci.
@+ tard

ViPHP
ViPHP | 5462 Messages

17 févr. 2011, 16:42

et quelle est l'erreur ?

ViPHP
ViPHP | 2577 Messages

17 févr. 2011, 17:19

Bonjour,

J'ai trouvé cet exemple qui permet de se passer de mysql_real_escape_string($data) et donc de ne pas toucher au contenu :
$mysqli = new mysqli('localhost', 'utilisateur', 'mot_de_passe', 'base');

/* Vérification de la connexion */
if (mysqli_connect_errno()) {
  printf("Connexion échouée : %s\n", mysqli_connect_error());
  exit();
}

$stmt = $mysqli->prepare("INSERT INTO Langage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

/* Exécution de la requête préparée */
$stmt->execute();
Le doc est la : http://www.manuelphp.com/php/function.m ... -param.php
et il y a un type b pour les BLOB qui sont envoyés par paquet (source de ton problème ?)

Edit : De la même facon, il y a http://www.manuelphp.com/php/function.m ... result.php pour la lecture

Getsuga
Invité n'ayant pas de compte PHPfrance

18 févr. 2011, 08:30

et quelle est l'erreur ?
Une erreur sql lors de l'insertion en base au niveau de la variable "$data". L'erreur type "Erreur insertion sql ..." et i l affichait le contenu du "$data" en s'arrêtant sur certains caractères.
Par contre, je viens de relancer ce petit script, et ce matin plus de message d'erreur (il affiche même le pdf) mais il n'enregistre rien en base ... J'y comprends plus rien !

@+ tard

Getsuga
Invité n'ayant pas de compte PHPfrance

18 févr. 2011, 08:45

C'est bon j'ai réussi. Problème d'échappement des caractères. J'ai modifié le code comme suit :

Code : Tout sélectionner

$data = mysql_real_escape_string(file_get_contents("SERVEUR_X86_2010.PDF"));
Et ça fonctionne, insertion sans aucun problème.

Merci à tous ceux qui m'ont donné des pistes et qui m'ont répondu.
Bonne journée !