comment stocker des fichiers(pdf,doc,..) dans sql server?

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 : comment stocker des fichiers(pdf,doc,..) dans sql server?

je teste et je vous dit quoi

par maghnaou » 05 oct. 2006, 00:38

merci beaucoup pour votre soutien, je vais tester votre solution et je vous dis
quoi.
merci encore une fois

par sadeq » 04 oct. 2006, 08:43

Est-ce que tu as envoyé un
header("Content-type: application/pdf");
au navigateur pour lui préciser le type mime adéquat de la réponse HTTP.

Si le client web a son plugin pdf correctment installé, il va alors
télécharger le fichier pdf localement et le faire afficher par le plugin
acrobat.

Mais effectivement le problème est dans le codage binaire à l'entrée et à la sortie de la base.

Alors, pour te donner une piste : le code suivant peut lire une source fichier et la transmettre via HTTP comme attachement (ou juste un flux formaté selon un type MIME reconnu par les navigateurs)
En loccurence est équivalent à un téléchargement via

Code : Tout sélectionner

<a href='fichier'>
Le code :
<?php
//nom et type du fichier (par défaut : pdf) 
$_GET["file"]= $_GET["file"]?$_GET["file"]:null;  
$_GET["type"]= $_GET["file"]&&$_GET["type"]?$_GET["type"]:$_GET["file"]&&preg_match("#[.]([^.]*)$#", $_GET["file"], $r)&&$r[1]?$r[1]:"pdf";  
$datastring = $_GET["file"]?@file_get_contents("$_GET[file]"):null;   

//téléchargement vers le client 
if ($datastring){  
    switch (strtolower($_GET["type"])){ 
        case "bmp": header("Content-type: image/bmp;"); break; 
        case "gif": header("Content-type: image/gif;"); break; 
        case "jpg": header("Content-type: image/pjpeg;"); break; 
        case "png": header("Content-type: image/png;"); break; 
        case "pdf": default:
					header("Content-type: application/pdf;");
					header("Content-Disposition: attachment; filename={$_GET[file]} ");
     } 
    echo $datastring; 
} 
else echo "<p>Pas de fichier!</p>"; 
?>
NB: Autres choses, il faut configurer l'extension mssql de PHP et SQL Server pour qu'ils accéptent les chaîne à grande capacité :
Dans PHP.ini (modifier et relancer le serveur Web):

Code : Tout sélectionner

//Valid range 0 - 2147483647. Default = 4096. mssql.textsize = 2147483647
Et pour SQL Server:
Exécuter cette requête avant chaque opération INSERT/UPDATE/SELECT.
mssql_query($sql = "SET TEXTSIZE 2147483647");
 

ça ne marche toujours pas

par maghna » 04 oct. 2006, 01:45

d'abord merci beaucoup pour ta réponse, grace à ton code j'arrive à insérer le contenu binaire dans ma base sql server, par contre le récupérer et l'afficher ne marche toujours pas il m'affiche le contenu binaire(j'utilise des fichiers pdf). j'ai essayé un pack mais pas moyen
merci de m'avancer la dessus

par sadeq » 03 oct. 2006, 16:54

Voici un exemple de transfert d'une image d'un fichier à SQL Server :
<?php 
//connect
@mssql_connect("localhost", "sa", "sa") or die ("<p>Base de données 'test' absente!</p>");
if (!@mssql_select_db("test")) {
	@mssql_select_db("master")or die ("<p>Base de données 'test' absente!</p>"); 
	@mssql_query("create database test")or die ("<p>Base de données 'test' absente!</p>"); 
	@mssql_select_db("test") or die ("<p>Base de données 'test' absente!</p>"); 
}

//create table image
@mssql_query("if ((select count(*) from sysObjects where name='image')<=0) 
create table image (name varchar(255) not null, type varchar(4) not null default 'jpg', data image null, constraint pk_image primary key (name) );")
or die ("<p>Base de données 'test' absente!</p>"); 

// save file to store image 
$_GET["file"]= $_GET["file"]?$_GET["file"]:null;
$_GET["type"]= $_GET["type"]?$_GET["type"]:preg_match("#[.]([^.]*)$#", $_GET["file"], $r)&&$r[1]?$r[1]:"jpg";
$datastring = $_GET["file"]?@file_get_contents("$_GET[file]"):null; 
$data = $datastring?@unpack("H*hex", $datastring):null;
if (!$data 
||  (!@mssql_query("insert into image (name, type, data) values ('$_GET[file]', '$_GET[type]', 0x$data[hex]);")
	&&  !@mssql_query("update image set type = '$_GET[type]', data = 0x$data[hex] where name = '$_GET[file]';"))
)	die ("<p>La source '$_GET[file]' n'est pas traitée, l'image n'est pas enregistrée dans la base!</p>");

// retrieving 
$result = mssql_query("select type, data from image WHERE name = '$_GET[file]'"); 
if ($result && $image = mssql_fetch_object($result)){
	switch (strtolower($image->type)){
		case "bmp": header("Content-type: image/bmp;"); break;
		case "gif": header("Content-type: image/gif;"); break;
		case "jpg": header("Content-type: image/pjpeg;"); break;
		case "png": header("Content-type: image/png;"); break;
		default: header("Content-type: image/jpeg;");
	}
	echo $image->data;
	
}
else echo "<p>Pas d'image!</p>";
?>

par zeus » 20 sept. 2006, 10:25

Modération : merci d'utiliser les balises
 ou [CODE] pour mettre en forme le code ;)[/color]

non ça ne passe pas

par magh » 20 sept. 2006, 10:18

merci beaucoup pour vos réponse, il se trouve que quand j'ai exposé cette solution à la personne qui s'occupe du serveur d'hébergement, elle refuse catégoriquement, toute sauvegarde sur des rép du serveur doit passer par lui et en quelque sorte je n'ai pas le choix que d'enregister dans une BD.
Maintenant ce que je vous demande please, comment peut on insérer un fichier(.doc,.pdf,.xls) dans une base de données MS SQL SERVER, en php et aller le récupérer pour l'afficher.
Je l'ai déjà fait avec MySQL et ça foctionne, mais pas avec SQL SERVER, j'ai appliqué le même principe mais apprement il me lit le contenu du fichier binaire et refuse de l'insérer, voici mon code :
 <?php $nom = $_FILES['fich']['name']; 
    $type = $_FILES['fich']['type']; 
    $taille = $_FILES['fich']['size']; 
    $fich= $_FILES['fich']['tmp_name']; 

    if ($f = fopen( $fich, "r"))  
        { 
        $contenu=fread($f, $taille); 
        $donnees=addslashes($contenu); 
        $idservice="dircot"; 
        $req= "INSERT INTO $table(nomfic,categorie,dateinsert,periode,idservice,fic) VALUES ('$nom','rapport','$date','$periode','$idservice','$donnees')"; 
        $idreq=mssql_query($req, $connexion); 
        $nb=mssql_affected_rows($connexion); 
        if ($nb<=0) {echo "l'insertion a échoué !<br>Erreur: ". mssql_error()."<br>";} 
    }
j'attend vos suggestions
merci

par sadeq » 19 sept. 2006, 11:27

Oui mais ce que dit @rthur ne rentre pas en conflit avec la règle de sécurité que tu décris. Pour la simple raison que les utilisateurs passent tous par le serveur Web qui est habilité à écrire dans le disque les fichiers qu'ils ont envoyés ; Du coups seul le serveur Web a le droit d'écrire mais pas les utilisateurs (ça marche comme ça un upload) la sécurité est observée.

Dans ce cas le serveur Web sert comme passerelle d'authentification des accès utilisateurs vis-à-vis du site Web, de la base de données et du disque en mettant en place la logique du programme dans ce sens.

Schèma général:
  • Etape1 :
    Utilisateur --- demande de page de travail ---> Serveur Web
    Serveur Web --- page de travail demandée ---> Utilisateur
    Utilisateur --- login/mdp ---> Serveur Web --- redirection login/mdp ---> Base de données
    Base de données --- autorisation/rejet ---> Serveur Web
    (Si rejet) Serveur Web --- avertissement ---> Utilisateur
    (Si autorisation) Serveur Web --- suite de la page de travail ---> Utilisateur
  • Etape2 (si autorisation) :
    Utilisateur --- fichier(n) ---> Serveur Web (Upload)
    Serveur Web (après Upload) --- fichier(n) ---> Disque
    Serveur Web (après Upload) --- chemin fichier(n) ---> base de données
    (Si sans erreur) Serveur Web --- information ---> Utilisateur
    (Si erreur) Serveur Web --- avertissement ---> Utilisateur

stocker dans une base de données est une contrainte obligato

par magh » 19 sept. 2006, 11:12

en fait pour des raisons de sécurité et pour permettre à plusieurs personnes de mettre à jour le contenu(fichier insérées), on a le droit d'accéder à la base directement à travers le site, par contre on a pas le droit d'écrire sur le serveur, si on veut par exemple sauvegardé un fichier sur le serveur dans un rep il faut l'envoyer à la personne qui s'occupe du serveur et elle le fera(aucun accès n'est autorisé même avec mot de passe), donc la seule solution est de stocker ces fichiers dans une bd
voilà
merci pour ta réponse

par @rthur » 19 sept. 2006, 10:57

Bonjour,

Est-il impératif que tu stockes le contenu de tes fichiers dans ta base de données?
Si ce n'est pas le cas, la méthode la plus simple à mon avis est simplement de stocker ses fichiers dans un répertoire et de mettre dans la base de données l'url qui pointe vers ces fichiers.

Voici un tuto pour gérer l'upload de fichier sur un serveur via un formulaire HTML:
http://www.phpfrance.com/tutoriaux/inde ... e-fichiers

comment stocker des fichiers(pdf,doc,..) dans sql server?

par magh » 19 sept. 2006, 10:43

Bonjour à tous,
pour la réalisation d'un site intranet en php, j'ai besoin que les utilisateurs stockent dans une base de données MS SQL SERVER des fichiers(récuperées à travers un formulaire : <input name='fich' type='file'>).
mon soucis est :
- comment récuperer le fichier de l'utilisateur à travers le formulaire et l'insérer dans la table fichier(idfichier,nom,lefichierluimême(varbinary(max))

- ensuite en cas de besoin(consultation) le récupérer de la base et l'afficher sur une page web

=>est ce qu'il y'a des conversions à faire???

c'est vraiment urgent, aidez moi svp