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

Dotnet Discussion :

Connaître le type d'un fichier grace à son codage base64Binary!


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut Connaître le type d'un fichier grace à son codage base64Binary!
    Bonjour,
    Je suis actuellement sur un projet dans lequel je dois faire interagir des formulaires InfoPath et un web service qui sera chargé du stockage en BD de certaines informations dudit formulaire.

    L'envoie des informations se fait sous forme de chaine de caractères (fichier intégral) et est ensuite stocké en XML pour l'analyse; cependant, mon formulaire contient un champ "piece jointe";
    Voici un partie du fichier XML résultant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <sitmat>Célibataire</sitmat>
        <nbrenfant>0</my:nbrenfant>
        <Dateactu >06-04-2009   </Dateactu>
        <fichier>x0lGQRQAAAABAAAAAAAAAAkAAAAIAAAAZABhAG4ALgB0AHgAdAAAADc2NjY1NTcxNg==
       </fichier>
    En observant le fichier XSchema du formulaire, j'ai remarqué que le type du champ "pièce jointe" est en "base64Binary".
    Mon soucis, est comment à partir de cette chaine contenue dans <fichier></fichier>, pouvoir reconstituer intégralement le fichier joint, et connaitre son type ?

    NB: l'utilisateur peut joindre n'importe quel fichier(.jpg,.png,.doc.ppt ....)

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    http://www.codeproject.com/KB/cs/base64encdec.aspx
    Après, si tu n'as pas le nom de la pièce jointe, il faudra regarder la signature du fichier (les quelques premiers octets du fichiers, qui sont en général significatifs du format).

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut Connaître le type d'un fichier grace à son codage base64Binary!
    Salut,
    J'ai testé le code, et lorsque j'affiche le résultat dans la console, je vois le nom du fichier, ainsi que son contenu (juste un fichier .txt). Mais aussi, ya des caractères plutôt bizarre, je pense bien que c'est la signature du type de fichier, mais comment pouvoir récupérer cela.
    Voici un bout de code que j'ai utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public string decodeBase64String(string encodedData)
            {
                byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
                string returnValue = System.Text.UnicodeEncoding.ASCII.GetString(encodedDataAsBytes);
                return returnValue;
            }
    Ce que j'aimerais, c'est à partir du résultat du codage en base64Binary retrouver le fichier intégralement, sans même connaitre son type.
    C'est plutôt la mer tout ça...

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Tu es sur que tes données sont codées en ASCII ? à défaut utiliser Default et pas ASCII.

    Sinon pour les caractères justement je pense que c'est un problème d'encodage mais la "perte" de caractères se produit au moment du ASCII.GetString. Donc le encodedDataAsBytes lui est valide et contient bien ton fichier original.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut
    Je ne sais pas dans quel format InfoPath code les données.
    Voici le fichier XSchema que j'ai pu extraire du fichier InfoPath :

    Code xml : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <xsd:schema targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-04-01T17:16:15" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:tns="http://MozService/" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-04-01T17:16:15" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<xsd:element name="mesChamps">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:groupe1" minOccurs="0"/>
    				<xsd:element ref="my:groupe4" minOccurs="0"/>
    			</xsd:sequence>
    			<xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="groupe1">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:nom" minOccurs="0"/>
    				<xsd:element ref="my:prenom" minOccurs="0"/>
    				<xsd:element ref="my:date" minOccurs="0"/>
    				<xsd:element ref="my:groupe2" minOccurs="0"/>
    				<xsd:element ref="my:groupe3" minOccurs="0"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="nom" type="xsd:string"/>
    	<xsd:element name="prenom" type="xsd:string"/>
    	<xsd:element name="date" nillable="true" type="xsd:date"/>
    	<xsd:element name="groupe2">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:remarque" minOccurs="0"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="remarque" type="xsd:string"/>
    	<xsd:element name="groupe3">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:Lien" minOccurs="0"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="Lien" type="xsd:string"/>
    	<xsd:element name="groupe4">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:sitmat" minOccurs="0"/>
    				<xsd:element ref="my:nbrenfant" minOccurs="0"/>
    				<xsd:element ref="my:fichier" minOccurs="0"/>
    				<xsd:element ref="my:champ1" minOccurs="0"/>
    				<xsd:element ref="my:groupe5" minOccurs="0"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="sitmat" type="xsd:string"/>
    	<xsd:element name="nbrenfant" type="xsd:string"/>
    	<xsd:element name="fichier" nillable="true" type="xsd:base64Binary"/>
    	<xsd:element name="champ1" type="xsd:string"/>
    	<xsd:element name="groupe5">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:groupe6" minOccurs="0" maxOccurs="unbounded"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="groupe6">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:libelle" minOccurs="0"/>
    				<xsd:element ref="my:prix" minOccurs="0"/>
    				<xsd:element ref="my:qte" minOccurs="0"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="libelle" type="xsd:string"/>
    	<xsd:element name="prix" type="xsd:string"/>
    	<xsd:element name="qte" type="xsd:string"/>
    </xsd:schema>



    <xsd:element name="fichier" nillable="true" type="xsd:base64Binary"/>
    Je vois là, que le type est base64Binary, mais comment le codage se fait, ça c'est le trou noir pour moi

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Mais de quoi parles tu ? c'est pas écris dans le xsd le codage utilisé pour écrire la chaine de caractères. Un fichier texte sous Windows peut être codé de plein de manières différentes. Usuellement tu peux obtenir le bon fichier avec le codage ASCII, UTF8 ou Unicode. C'est donc au niveau de ton ASCII.GetString qu'il faut jouer pour retrouver ton fichier texte d'origine. Si c'est pas un fichier texte, alors tu ne dois pas reconvertir en string mais utiliser directement le byte[] que tu as obtenu après le décodage à partir du base64.

Discussions similaires

  1. Connaître le type du fichier
    Par Paul Van Walleghem dans le forum VB.NET
    Réponses: 6
    Dernier message: 08/03/2010, 22h28
  2. Connaitre le type d'un fichier sans son extension
    Par ionone dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 15/07/2009, 14h19
  3. Connaître le type mime d'un fichier
    Par Vlacar dans le forum Langage
    Réponses: 1
    Dernier message: 24/05/2007, 19h37
  4. JS: Connaître le type d'un champ HTML via son nom
    Par NikoBe dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 02/11/2006, 11h24
  5. Réponses: 5
    Dernier message: 06/03/2003, 13h27

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