PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → Problème de fichier corrompu lors de decodage en base 64 d'image
Problème de fichier corrompu lors de decodage en base 64 d'image
Started by cora, Feb., 20 2024 3:23 PM - 3 replies
Registered member
10 messages
Posted on February, 20 2024 - 3:23 PM
Bonjour,

J'utilise Flask en Python pour créer une API qui génère un JSON contenant quatre images stockées sous forme de BLOB encodées en base64. Voici le code que j'utilise pour cela :

# Convertir les données binaires en base64
form_data['signatureClient'] = base64.b64encode(form.signature_client).decode('utf-8') if form.signature_client else None
form_data['signatureTech'] = base64.b64encode(form.signature_technicien).decode('utf-8') if form.signature_technicien else None
form_data['photoAvant'] = base64.b64encode(form.photo_av_intervention).decode('utf-8') if form.photo_av_intervention else None
form_data['photoApres'] = base64.b64encode(form.photo_apr_intervention).decode('utf-8') if form.photo_apr_intervention else None            
form_fin_list.append(form_data)


Cependant, lorsque je reçois ces images sur Windev, j'aimerais les décoder pour les enregistrer localement. Malheureusement, je rencontre des difficultés et je pense que je ne parviens pas à les décoder correctement, car je me retrouve avec des fichiers corrompus. Voici le code que j'utilise pour décoder les images sur Windev :

DonnéesBlobImage = Decode(stSvaleur.signatureClient,encodeBASE64)
Nomfichier = "Signature " + stSvaleur.nomSignatureClient + " Intervention n" + stSvaleur.id_intervention + ".jpeg"
fSauveBuffer(sCheminImageLocaleSignatureClient + Nomfichier, DonnéesBlobImage)
fic_formulaire_fin_intervention.formInter_chemin_signature_client = Nomfichier


J'ai aussi essayé avec d'autres méthodes (UnicodeVersAnsi(), UTF8VersChaîne(), UTF8VersAnsi() ou passer d'autre format de décodage à Décode (encodeBase64SansRC, encodeBase64URL) mais toujours le même problème mes images ont des erreurs et ne peuvent donc pas être ouverte.

Si vous avez des suggestions ou des idées. Merci d'avance
Registered member
3,347 messages
Popularité : +93 (137 votes)
Posted on February, 20 2024 - 4:07 PM
Salut,
Ton json est sous quelle forme ?
Je suppose aussi que tu utilises un httprequête ?
Ensuite il existe 4 solutions en windev pour "parser" le json
Laquelle a tu choisis ?
Comme tu vois, ta question est vague. Et qu'à tu fais pour vérifier chaque étape
Comment est tu sur de n'avoir qu'une chaine 64 d'image et pas de caractère en trop où en moins ?
Registered member
10 messages
Posted on February, 21 2024 - 3:54 PM
Mon json est un tableau d'objet json. Par exemple :
[
{
"idForm": 1,
"telephoneClient": "0123456789",
},
{
"idForm": 2,
"telephoneClient": "0987654321",
}
]


J'utilise une restRequête pour faire la requête sur windev

Pour parser j'ai utilisé Désérialise,

Voici mon code windev mais je réussis a récupéréer toutes les informations de ma réponse je bloque seulement sur la conversion de mes images.

Requete est une restRequête
Requete.Méthode = httpGet
Requete.URL = "http://localhost:5000/form"
ReponseRq est une restRéponse = RESTEnvoie(Requete)
tabTableauFormFinInter est un tableau de FormulaireFinIntervention
tabTableauFormSave est un tableau d'entiers
DonnéesBlobImage est un Buffer
Nomfichier est une chaîne
sImageANSI est une chaîne ANSI
sImageANSItest est une Buffer
SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
QUAND EXCEPTIONEXCEPTION DANS
Désérialise(tabTableauFormFinInter, ReponseRq.Contenu, psdJSON)
FAIRE
RENVOYER tabTableauFormSave
FIN
SI tabTableauFormFinInter.Vide = Faux ALORS
POUR TOUT stSvaleur de tabTableauFormFinInter
HLitRecherche(fic_formulaire_fin_intervention,IDfic_interventions,stSvaleur.id_intervention,hIdentique)

SI HTrouve(fic_formulaire_fin_intervention)ALORS
fic_formulaire_fin_intervention.IDfic_formulaire_fin_intervention = stSvaleur.idForm sImageBase64SignatureClient est une chaîne = UTF8VersChaîne(stSvaleur.photoApres,alphabetAnsi) bufDonnéesSignatureClien est un Buffer = Decode(sImageBase64SignatureClient, encodeBASE64) Nomfichier = "Signature " + stSvaleur.nomSignatureClient + stSvaleur.id_intervention + ".jpeg"
fSauveBuffer(sCheminImageLocaleSignatureClient + Nomfichier, sImageBase64SignatureClient)
fic_formulaire_fin_intervention.formInter_chemin_signature_client = Nomfichier

sImageANSItest = UnicodeVersAnsi(stSvaleur.signatureTech,alphabetAnsi)
DonnéesBlobImage = Decode(sImageANSItest,encodeBASE64)
Nomfichier= "Signature " + stSvaleur.nomSignatureTech + stSvaleur.id_intervention + ".jpeg"
fSauveBuffer(sCheminImageLocaleSignatureTech + Nomfichier,sImageANSItest)
fic_formulaire_fin_intervention.formInter_chemin_signature_tech = Nomfichier


Pour tester mon endpoint de l'api j'ai fait un petit script python de test qui récupérer bien les images et me les mets bien dans le dossier locale donc selon moi la réponse de l'api est correcte c'est ma partie windev qui pose problèmes.

SAVEDIR = r"C:\Users\user\Documents\"
def fetch_and_save_images():
    try:
        response = requests.get('http://localhost:5000/form')
        data = response.json()
        for form in data:
            if isinstance(form['photoAvant'], str) and form['photoAvant']:
                saveimagefrombase64(form['photoAvant'], f"photo_avant{form['idForm']}.jpeg")
            if isinstance(form['photoApres'], str) and form['photoApres']:
                saveimagefrombase64(form['photoApres'], f"photo_apres{form['idForm']}.jpeg")
    except Exception as e:
        print(f"Une erreur s'est produite : {str(e)}")

def saveimagefrombase64(base64string, filename):
    try:
        image_data = base64.b64decode(base64string)
        image = Image.open(BytesIO(image_data))
        save_path = os.path.join(SAVEDIR, filename)
        image.save(save_path, "JPEG")
        print(f"L'image {filename} a été sauvegardée avec succès dans {SAVEDIR}.")
    except Exception as e:
        print(f"Erreur lors de la sauvegarde de l'image {filename}: {str(e)}")
fetch_and_save_images()
Message modified, February, 21 2024 - 3:58 PM
Registered member
3,347 messages
Popularité : +93 (137 votes)
Posted on February, 22 2024 - 6:28 AM
Salut
Merci de la réponse
Je vois plusieurs raisons qui pourraient faire bloquer la conversion comme
sImageANSI est une chaîne ANSI
Puis
sImageBase64SignatureClient est une chaîne = UTF8VersChaîne
sImageANSItest = UnicodeVersAnsi
Je comprends que tu essaies plusieurs techniques pour essayer de trouver le bon code
Ok pour ça
Mais avant cela, il faudrait déjà vérifier que ta chaîne de l'image en base 64 est bonne
Pour cela tu peux la tester dans une page HTML
Voici une page explicative
https://www.sheets-pratique.com/fr/codes/inserer-image
Tu test après le code python
Puis tu test après la deserialisation
Après UTF8VersChaîne et après UnicodeVersAnsi ou avant Decode
Enfin a tout les endroits où cela te semble nécessaire
Une fois que tu constates que ta chaîne est bonne alors tu peux essayer le decode.