pythondjangodjango-filebrowser

Decoding error in django filebrowser 3.2 on linux


The error message:

Traceback:
File "/web/hvita_perlan/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/web/hvita_perlan/lib/python2.6/site-packages/django/contrib/admin/views/decorators.py" in _checklogin
  19.             return view_func(request, *args, **kwargs)
File "/web/hvita_perlan/lib/python2.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  79.         response = view_func(request, *args, **kwargs)
File "/web/hvita_perlan/lib/python2.6/site-packages/filebrowser/views.py" in browse
  99.         fileobject = FileObject(os.path.join(file_dir, file))
File "/web/hvita_perlan/lib/python2.6/posixpath.py" in join
  70.             path += '/' + b

Exception Type: UnicodeDecodeError at /admin/filebrowser/browse/
Exception Value: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

The string that could not be encoded/decoded was: /1h����.j

The file real filename is: 1hæð.jpg

some info:

> locale
LANG=en_GB.UTF-8

-

> python manage.py shell
>>> import locale
>>> locale.getlocale()
('en_GB', 'UTF8')

>>> import os
>>> os.stat('../uploads/_promotional/1hæð_fb_thumb.jpg')
posix.stat_result(st_mode=33279, st_ino=788504L, st_dev=51713L, st_nlink=1, st_uid=0, st_gid=0, st_size=1629L, st_atime=1311176542, st_mtime=1311176542, st_ctime=1311177235)

As you can see everything works in shell but not in django filebrowser.


Solution

  • The solution is here: http://diveintopython.net/xml_processing/unicode.html

    I solved the problem by adding sitecustomize.py to lib/python2.6/

    # sitecustomize.py                   
    # this file can be anywhere in your Python path,
    # but it usually goes in ${pythondir}/lib/site-packages/
    import sys
    sys.setdefaultencoding('utf-8')
    

    File browser files don't have the utf-8 header. I think they should change this. It looks like this:

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-