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

VBScript Discussion :

Encoder un fichier en base64


Sujet :

VBScript

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Encoder un fichier en base64
    Bonjour,

    j'utilise du VBscript dans une page HTML afin d'encoder un fichier en base64, pour transmettre à un webservice.

    J'ai pris exemple sur le code suivant en VB :
    http://www.developpez.net/forums/d59...-coder-base64/

    mais je n'arrive pas à l'adapter en VBScript.

    Voici en gros à quoi ressemble 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <html>
    <head>
    <SCRIPT LANGUAGE="VBScript">
    Function convertBase64(Text)
      MsgBox Text
     
      Dim Xml 
      Set Xml = CreateObject("MSXML2.DOMDocument.4.0")
     
      Dim Conv 'As MSXML.IXMLDOMElement
     
      Dim Arr() 'As Byte
     
      If Text = "" Then
        Encode_Base64 = ""
        Exit Function
      End If
     
      Arr = StrConv(Text, vbFromUnicode)
      Set Conv = Xml.createElement("Base64")
      Conv.dataType = "bin.base64"
      Conv.nodeTypedValue = Arr
      Encode_Base64 = Conv.Text
     
    End Function
    </script>
     
    </head>
    <body>
    <FORM NAME="Feuille1">
       <INPUT TYPE="Button" NAME="Bouton1" VALUE="Clic">
       <SCRIPT FOR="Bouton1" EVENT="onClick" LANGUAGE="VBScript">
          convertBase64("c:\toto.txt")
       </SCRIPT>
    </FORM>
    </body>
    </html>
    1er problème : je n'arrive pas à créer l'objet MSXML.IXMLDOMElement
    2eme problème : la méthode StrConv ne marche pas (existe-elle en VBscript) ?

    Merci d'avance pour vos réponses et suggestions.

  2. #2
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    salut, StrConv n'est pas pris en charge par le moteur VBScript.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse.

    J'utilise le script d'encodage suivant : http://www.motobit.com/tips/detpg_Base64Encode/

    Cela fonctionne pour les fichiers .txt, mais pas pour les .jpg, et .doc.
    J'utilise ce script dans une page HTML donc je ne peux pas utiliser d'objet ADODB.Stream.

    Voici 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
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    <html>
    <head>
    <SCRIPT LANGUAGE="VBScript">
     
    Function Base64Encode(inData)
      'rfc1521
      '2001 Antonin Foller, Motobit Software, http://Motobit.cz
     
     
      Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
      Dim cOut, sOut, I
     
      'For each group of 3 bytes
      For I = 1 To Len(inData) Step 3
        Dim nGroup, pOut, sGroup
     
        'Create one long from this 3 bytes.
        nGroup = &H10000 * Asc(Mid(inData, I, 1)) + &H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))
     
        'Oct splits the long To 8 groups with 3 bits
        nGroup = Oct(nGroup)
     
        'Add leading zeros
        nGroup = String(8 - Len(nGroup), "0") & nGroup
     
        'Convert To base64
        pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
     
        'Add the part To OutPut string
        sOut = sOut + pOut
     
        'Add a new line For Each 76 chars In dest (76*3/4 = 57)
        If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
      Next
     
      Select Case Len(inData) Mod 3
        Case 1: '8 bit final
          sOut = Left(sOut, Len(sOut) - 2) + "=="
        Case 2: '16 bit final
          sOut = Left(sOut, Len(sOut) - 1) + "="
      End Select
      Base64Encode = sOut
     
    End Function
     
    Function MyASC(OneChar)
      If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
    End Function
     
    'Conversion base64 MSXML2.DOMDocument.4.0
    Function Convert64XML(cheminFic)
     
    	Dim Fso
      Set Fso = CreateObject("Scripting.FileSystemObject")
    	Set LOGfileName = Fso.OpenTextFile("c:\logconvert64XML.txt", 2)
     
     
    	MsgBox "Convert64XML:" & cheminFic
    	Set objXMLDoc = CreateObject("MSXML2.DOMDocument.4.0")
     
      'The root node itslef will contain the base64 encoded data
      objXMLDoc.loadXML "<Base64Data />"
     
    	Const ForReading = 1
      Dim oFso, f
      Set oFso = CreateObject("Scripting.FileSystemObject")
      Set f = oFso.OpenTextFile(cheminFic, ForReading, True)
     
    	set oElement = objXMLDoc.documentElement
     
      oElement.dataType = "bin.base64"
     
    	Dim s
    	Dim ligne
    	while Not f.AtEndOfStream
    	 ligne = f.ReadLine
    	 s = s& ligne
    	Wend
     
    	oElement.nodeTypedValue = Base64Encode(s)
     
      ReadBinFileDom = objXMLDoc.Text 
     
      LOGfileName.write(ReadBinFileDom)
     
    	msgbox "ReadBinFileDom:" & ReadBinFileDom
     
    	LOGfileName.close()
     
    End Function
     
    </script>
     
    </head>
     
    <body>
    <FORM NAME="Feuille1">
       <INPUT TYPE="Button" NAME="Bouton1" VALUE="XML">
       <SCRIPT FOR="Bouton1" EVENT="onClick" LANGUAGE="VBScript">
         Convert64XML("c:\led-r.png")
       </SCRIPT>
    </FORM>
    </body>
    </html>
    Si quelqu'un voit ce qui cloche ?

    Merci.

  4. #4
    Membre confirmé Avatar de pitchalov
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 340
    Points : 582
    Points
    582
    Par défaut
    J'ai pas trop regardé à fond mais il y a ça qui m'a sauté aux yeux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For I = 1 To Len(inData) Step 3
        Dim nGroup, pOut, sGroup
        ...
    Next
    Je pense que ça doit te générer une erreur car les mêmes variables sont définies plusieurs fois (car dans une boucle), et ça l'interpréteur aime pas trop.

    Pour pas avoir d'erreur comme ça, c'est plus sûr de déclarer tes variables globales en début de script et tes variables locales en début de fonction, mais après c'est toi qui voit bien sûr

    T'as d'autres erreurs sinon?

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Ok, merci.

    Je n'avais pas d'erreur, c'était les résultats de l'encodage qui étaient "bizarres". Maintenant cela fonctionne !
    La solution : il fallait utiliser la méthode Read(taille du fichier) et nom pas les méthodes readAll() ou readLine()... Voici le 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
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    <html>
    <head>
    <SCRIPT LANGUAGE="VBScript">
     
    Function Base64Encode(inData)
     
      Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
      Dim cOut, sOut, I,nGroup, pOut, sGroup
     
    	For I = 1 To Len(inData) Step 3
     
        'Create one long from this 3 bytes.
        nGroup = &H10000 * Asc(Mid(inData, I, 1)) + &H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))
     
        'Oct splits the long To 8 groups with 3 bits
        nGroup = Oct(nGroup)
     
        'Add leading zeros
        nGroup = String(8 - Len(nGroup), "0") & nGroup
     
        'Convert To base64
        pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
     
        'Add the part To OutPut string
        sOut = sOut + pOut
     
        'Add a new line For Each 76 chars In dest (76*3/4 = 57)
        If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
      Next
     
      Select Case Len(inData) Mod 3
        Case 1: '8 bit final
          sOut = Left(sOut, Len(sOut) - 2) + "=="
        Case 2: '16 bit final
          sOut = Left(sOut, Len(sOut) - 1) + "="
      End Select
      Base64Encode = sOut
     
    End Function
     
    Function MyASC(OneChar)
      If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
    End Function
     
    'Conversion base64 MSXML2.DOMDocument.4.0
    Function Convert64XML(strFilePath)
    	Dim Fso
      Set Fso = CreateObject("Scripting.FileSystemObject")
     
    	Set LOGfileName = Fso.OpenTextFile("c:\logconvert64XML.txt", 2)
     
    	Set objXMLDoc = CreateObject("MSXML2.DOMDocument.4.0")
      'Le noeud root contient la base64 encoded data
      objXMLDoc.loadXML "<Base64Data />"
     
    	Const ForReading = 1
      Dim oFso, fic,longFic
      Set oFso = CreateObject("Scripting.FileSystemObject")
     
    	'Calcul de la taille du fichier strFilePath (en octet)
    	Set fic = FSO.GetFile(strFilePath)
      longFic = fic.Size
    	Set fic = Nothing
    	'Ouverture du fichier strFilePath
      Set fic = oFso.OpenTextFile(strFilePath, ForReading, True)
     
    	set oElement = objXMLDoc.documentElement
      oElement.dataType = "bin.base64"
     
    	'il faut utiliser la méthode read(taille fichier) plutôt que la méthode readAll
    	oElement.nodeTypedValue = Base64Encode(fic.read(longFic))
    	fic.close()
     
      ReadBinFileDom = objXMLDoc.Text 
     
      LOGfileName.write(ReadBinFileDom)
    	LOGfileName.close()
     
    End Function
     
    </script>
     
    </head>
     
    <body>
    <FORM NAME="Feuille1">
       <INPUT TYPE="Button" NAME="Bouton1" VALUE="XML">
       <SCRIPT FOR="Bouton1" EVENT="onClick" LANGUAGE="VBScript">
         Convert64XML("c:\led-r.png")
       </SCRIPT>
    </FORM>
    </body>
    </html>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. encoder des fichiers audio
    Par thugelife dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 16/07/2009, 19h54
  2. [BATCH]script pour encoder des fichiers dans une arborescence
    Par ashgan44 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 11/05/2009, 15h04
  3. Encoder un fichier en .avi
    Par miketidy dans le forum Vidéo
    Réponses: 4
    Dernier message: 17/09/2008, 13h44
  4. Encoder des chaînes en base64 pour POST?
    Par fredtheman dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/01/2008, 11h25

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