IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Encodage Upload File


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    kap
    kap est déconnecté
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 188
    Par défaut Encodage Upload File
    Bonjour à tous,

    J'ai apparemment un problème d'encodage avec l'upload d'un fichier texte. Je développe une application javascript + GoogleAppEngine (Python). Les utilisateurs doivent pouvoir charger un fichier texte local et réaliser des traitements côté client. Pour se faire, j'utilise le plugin jQuery File-Upload. Pour fonctionner sous IE09 (browser utilisé par mon client), le plugin utilise une iframe pour envoyer le fichier et récupérer son contenu. Voici mon code python pour retourner le contenu du fichier (je tiens à préciser que je suis débutant en python, un autre développeur s'occupe normalement de la programmation côté serveur mais il est parti en vacances):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @csrf_exempt
    def fileUpload(request):
        try:
     
            file = request.FILES['files'] 
            content = file.read(file.size)
            logging.info(type(content))
            logging.info(content)
            result = [{"name": file.name,
                       "size": file.size,
                       "content": content}]
            logging.info(result)
            json_data =  json.dumps(result)
            logging.info(json_data)
            return HttpResponse(json_data, content_type='text/plain')
     
        except Exception, exception:
            return utility.create_http_error_response(exception.message)
    Mon client m'a envoyé un fichier texte. Celui-ci ne fonctionne pas. Voici les logs :

    2014-02-11 11:24:05.514 <type 'str'> 
    I 2014-02-11 11:24:05.560 Col1;Col2;...;ColN
    W 2014-02-11 11:24:05.566 /app/maps/views.py:444: DeprecationWarning: BaseException.message has been deprecated as of Py 
    E 2014-02-11 11:24:05.567 /app/maps/views.py:444: DeprecationWarning: BaseException.message has been deprecated as of Py 
    E 2014-02-11 11:24:05.567  return utility.create_http_error_response(exception.message)
    Si j'encode ce fichier en UTF-8 avec Notepad++, mon script fonctionne. Avez-vous une idée pour résoudre mon problème?

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Essaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        except Exception, exception:
            return utility.create_http_error_response(exception)
     
    # ou encore, python >= 2.6
        except Exception as exception:
            return utility.create_http_error_response(exception)

  3. #3
    kap
    kap est déconnecté
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 188
    Par défaut
    Merci pour ta réponse.

    J'ai implémenté ta deuxième proposition. Le client Javascript ne reçoit pas de retour. Dans mes logs, j'ai plusieurs erreurs dont :

    raise TypeError(repr(o) + " is not JSON serializable")
    TypeError: UnicodeDecodeError('utf8', "Brand;CD_SITE...

    Avant de voir ta réponse, j'ai testé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    result = {"name": file.name,
              "size": file.size,
              "content": unicode(content , errors='replace')}
    Là ça passe mais pour le coup mes "é" sont remplacés par des caractères "?", ce qui ne m'arrange pas

  4. #4
    kap
    kap est déconnecté
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 188
    Par défaut
    J'ai un peu contourné le problème mais la solution n'est pas satisfaisante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @csrf_exempt
    def fileUpload(request):
     
        def force_decode(string, codecs=['utf8', 'cp1252']):
            for i in codecs:
                try:
                    return string.decode(i)
                except:
                    pass    
     
        try:
     
            file = request.FILES['files']
            content = file.read(file.size)
            content = force_decode(content)
     
            logging.info(type(content))
            logging.info(content)
            result = {"name": file.name,
                       "size": file.size,
                       "content": content}
            logging.info(result)
            json_data =  json.dumps(result)
            logging.info(json_data)
            return HttpResponse(json_data, content_type='text/plain')
     
        except Exception, exception:
            return utility.create_http_error_response(exception)
    Ca fonctionne dans le cadre de ce fichier (puisque encodé en cp1252). L'application va être utilisée en Belgique, en Allemagne, en Italie et en France... Du coup je risque de rencontrer d'autres problèmes d'encoding... Si vous avez une meilleure piste, je suis preneur !!

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 748
    Par défaut
    Salut,

    Citation Envoyé par kap Voir le message
    Ca fonctionne dans le cadre de ce fichier (puisque encodé en cp1252). L'application va être utilisée en Belgique, en Allemagne, en Italie et en France... Du coup je risque de rencontrer d'autres problèmes d'encoding... Si vous avez une meilleure piste, je suis preneur !!
    Sauf a imposer que tous les fichiers soient utf-8, il faudra détecter l'encoding au pif et accepter de se planter de temps en temps. C'est déjà ce que vous faites et il n'y a pas d'autres solutions.
    Ceci dit, les anciens ont déjà fait le gros du boulot et pris le temps de le mettre a disposition via différents packages:
    • chardet: il fait un peu ce que vous faites (essai/erreur).
    • UnicodeDammit: avant de faire comme chardet, ça va regarder si l'encoding n'est pas donne dans le fichier.

    note: UnicodeDammit est intégré a BeautifulSoup. Il utilise chardet s'il le trouve.

    Reste a récupérer ces packages et les mettre en œuvre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [HttpUnit] upload file - le fichier qui change de taille
    Par Yannos94 dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/09/2007, 14h29
  2. Unzip uploaded file
    Par inessa dans le forum VB.NET
    Réponses: 1
    Dernier message: 02/04/2007, 15h06
  3. [Upload] file Upload: mettre un fichier sur le serveur
    Par eseb777 dans le forum Langage
    Réponses: 4
    Dernier message: 07/03/2007, 10h01
  4. Upload File Javascript
    Par DrE44 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/01/2007, 15h40
  5. [Upload] file upload preload
    Par taffMan dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2006, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo