Traitement d’images en Base64 avec WinDev et SQL Server
Cette documentation détaille deux segments de code WinDev utilisés pour :
- Encoder une image locale en Base64 puis l’insérer dans une base SQL Server
- Lire cette image encodée, la décoder, puis l’afficher via un champ image
1. Code d’insertion dans la base
sFichier est une chaîne = "C:\Users\dj\Pictures\Jardin 01.jpg"
bufTMP est un Buffer
sTMP est une chaîne ANSI
bufTMP = fChargeBuffer(sFichier)
sTMP = Encode(bufTMP, encodeBASE64SansRC)
sNomReq est une chaîne = "REQ"
sTmpSQL est une chaîne = [
INSERT INTO LATEUtilisateur (image_signature)
VALUES (convert(varchar(max), '[%sTMP%]'))
]
SI PAS SQLExec(sTmpSQL, sNomReq) ALORS
SQLErreur(sTmpSQL, sNomReq)
FIN
SQLFerme(sNomReq)
Explication : Ce code charge une image locale, l’encode en Base64, puis l’insère dans une base SQL Server en tant que texte.
Remarques :
- Le champ
image_signature
est défini ennvarchar(max)
. - Le contenu encodé est inséré sous forme de chaîne texte (Base64).
- Le code utilise
convert(varchar(max), ...)
dans la requête.
2. Code de lecture depuis la base
bufTMP est un Buffer
sTMP est une chaîne ANSI
sNomReq est une chaîne = "REQ"
sTmpSQL est une chaîne = [
SELECT image_signature FROM LATEUtilisateur
WHERE ref_utilisateur = 35
]
SI SQLExec(sTmpSQL, sNomReq) ALORS
SQLAvance(sNomReq)
sTMP = SQLLitMémoTexte(sNomReq, 1)
bufTMP = Décode(sTMP, encodeBASE64SansRC)
SINON
SQLErreur(sTmpSQL, sNomReq)
FIN
SQLFerme(sNomReq)
IMG_TEST = bufTMP
Explication : Ce code lit la chaîne Base64 depuis le champ image_signature
, la décode et affecte le buffer à un champ image (IMG_TEST
).
3. Points importants
Encodage et Types
- Base64 ajoute environ 33% de taille à l’image d’origine.
- Le champ
nvarchar(max)
double la taille car UTF-16 (Unicode). - WinDev envoie probablement les chaînes encodées comme Unicode → varchar(max) échoue.
Nom de colonne signature
signature
est un mot réservé dans SQL Server.- Utiliser des crochets :
[signature]
, ou renommer la colonne (ex :image_signature
).
4. Recommandations
- Utiliser des requêtes paramétrées si possible pour éviter les injections.
- Préférer
varbinary(max)
pour stocker l’image sans encodage, si compatible. - Continuer avec
nvarchar(max)
si c’est le seul format qui fonctionne avec WinDev.