Projet

Général

Profil

Bug #37374

import csv, afficher un message en cas de mauvais type de fichier

Ajouté par Frédéric Péters il y a plus de 4 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
31 octobre 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Révision 2936f256 (diff)
Ajouté par Valentin Deniaud il y a plus de 4 ans

csv_import: display error message on bad encoding (#37374)

Révision fba5f121 (diff)
Ajouté par Valentin Deniaud il y a plus de 4 ans

manager: clearer error message on invalid csv import file (#37374)

Historique

#1

Mis à jour par Valentin Deniaud il y a plus de 4 ans

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.

#2

Mis à jour par Valentin Deniaud il y a plus de 4 ans

  • Assigné à mis à Valentin Deniaud
#3

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".

#4

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.

#5

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.

1 https://developer.mozilla.org/en-US/docs/Mozilla/How_Mozilla_determines_MIME_Types#ExternalHelperAppService

#6

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

#7

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 ?

#8

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.

#10

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Statut changé de Solution proposée à Solution validée
#11

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)

#12

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

Formats disponibles : Atom PDF