Bug #37374
import csv, afficher un message en cas de mauvais type de fichier
0%
Description
Aujourd'hui,
File "/usr/lib/python2.7/dist-packages/authentic2/csv_import.py" in run 137. return parse_csv() File "/usr/lib/python2.7/dist-packages/authentic2/csv_import.py" in parse_csv 119. dialect = csv.Sniffer().sniff(input_fd.read().encode('utf-8')) File "/usr/lib/python2.7/codecs.py" in decode 314. (result, consumed) = self._buffer_decode(data, self.errors, final) Exception Type: UnicodeDecodeError at /manage/users/import/ Exception Value: 'utf8' codec can't decode byte 0xe9 in position 20: invalid continuation byte [...] FILES: import_file = <InMemoryUploadedFile: 59RSA93_1909010_0.csv (application/vnd.ms-excel)>
Fichiers
Révisions associées
manager: clearer error message on invalid csv import file (#37374)
Historique
Mis à jour par Valentin Deniaud il y a plus de 4 ans
- Fichier 0001-csv_import-display-error-message-on-bad-encoding-373.patch 0001-csv_import-display-error-message-on-bad-encoding-373.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
C'est un bug d'encodage à la lecture (le fait que ça soit un csv valide ou pas est traité ensuite). Donc je le corrige comme tel, et je n'implémente pas de vérification du mimetype comme pouvait le laisser sous entendre le titre du ticket.
Mis à jour par Frédéric Péters il y a plus de 4 ans
je n'implémente pas de vérification du mimetype comme pouvait le laisser sous entendre le titre du ticket.
L'idée sous-entendue était que si le type MIME était whatever/excel, il y ait un message pour dire "chouchou tape un CSV".
Mis à jour par Valentin Deniaud il y a plus de 4 ans
« Mais mon fichier s'appelle 59RSA93_1909010_0.csv, qu'est-ce que c'est que cette erreur qui me dit que c'est pas un CSV ? » --> erreur d'encodage ou erreur de type, c'est kif kif niveau compréhension je trouve.
Et puis comme on ne va pas refuser un fichier dont le mime n'est pas text/csv, il faudrait pour de vrai établir une liste de types à exclure, ça sera jamais propre imo. Je préfère m'en tenir à fixer la trace.
En passant j'aimerais bien savoir comment Django se retrouve informé du vrai mimetype, sûrement par la requête http, mais du coup quel navigateur s'amuse à parser le header d'un fichier avant de l'uploader ? Pas firefox j'ai l'impression.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Valentin Deniaud a écrit :
« Mais mon fichier s'appelle 59RSA93_1909010_0.csv, qu'est-ce que c'est que cette erreur qui me dit que c'est pas un CSV ? » --> erreur d'encodage ou erreur de type, c'est kif kif niveau compréhension je trouve.
Et puis comme on ne va pas refuser un fichier dont le mime n'est pas text/csv, il faudrait pour de vrai établir une liste de types à exclure, ça sera jamais propre imo. Je préfère m'en tenir à fixer la trace.
Oui c'est plus simple je pense, le mime-type envoyé n'est jamais fiable.
En passant j'aimerais bien savoir comment Django se retrouve informé du vrai mimetype, sûrement par la requête http, mais du coup quel navigateur s'amuse à parser le header d'un fichier avant de l'uploader ? Pas firefox j'ai l'impression.
Sur Firefox c'est principalement basé sur l'extension1.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Après ça pourrait être sympa de faire la différence entre un CSV en latin1, latin15 ou CP-1252 et un fichier binaire; je n'ai pas réellement d'idée sur comment faire sachant que pour les encodages 8bits (latin1&co) .decode('latin1')
marchera toujours.
On pourrait en profiter aussi pour rationaliser un poil les messages d'erreur genre "Fichier d'import invalide: <un truc plus précis>".
PS: une piste sur stackoverflow https://stackoverflow.com/questions/1446549/how-to-identify-binary-and-text-files-using-python
Mis à jour par Valentin Deniaud il y a plus de 4 ans
L'histoire des encodages c'est beaucoup de hack pour pas grand chose, je suis pour ouvrir un autre ticket dev si nécessaire et laisser celui-ci être une simple correction de bug (et je suggérerais ensuite d'utiliser filemagic et ainsi de se laver les mains de tous les faux positifs qu'on risque de se prendre).
On pourrait en profiter aussi pour rationaliser un poil les messages d'erreur genre "Fichier d'import invalide: <un truc plus précis>".
Je fais ça dans import_csv.py ou au moment de l'affichage dans forms.py ?
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Valentin Deniaud a écrit :
L'histoire des encodages c'est beaucoup de hack pour pas grand chose, je suis pour ouvrir un autre ticket dev si nécessaire et laisser celui-ci être une simple correction de bug (et je suggérerais ensuite d'utiliser filemagic et ainsi de se laver les mains de tous les faux positifs qu'on risque de se prendre).
Ok.
On pourrait en profiter aussi pour rationaliser un poil les messages d'erreur genre "Fichier d'import invalide: <un truc plus précis>".
Je fais ça dans import_csv.py ou au moment de l'affichage dans forms.py ?
Das forms.py je pense.
Mis à jour par Valentin Deniaud il y a plus de 4 ans
- Fichier 0002-manager-clearer-error-message-on-invalid-csv-import-.patch 0002-manager-clearer-error-message-on-invalid-csv-import-.patch ajouté
- Fichier 0001-csv_import-display-error-message-on-bad-encoding-373.patch 0001-csv_import-display-error-message-on-bad-encoding-373.patch ajouté
Voilà, manquera juste les traductions.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Valentin Deniaud il y a plus de 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit fba5f1217cc82d2373a8e84b6d79f7c2d860ca95 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Nov 21 10:20:34 2019 +0100 manager: clearer error message on invalid csv import file (#37374) commit 2936f25623e137f9a805cabdf0f4aa002e534118 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Tue Nov 19 14:42:17 2019 +0100 csv_import: display error message on bad encoding (#37374)
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
csv_import: display error message on bad encoding (#37374)