|
PROFESSIONAL NEWSGROUPS WINDEV, WEBDEV and WINDEV Mobile |
| | | | | |
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. |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|