2

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.

demux
  • 4,544
  • 2
  • 32
  • 56

4 Answers4

1

In django-filebrowser 3.5.6 there is a setting FILEBROWSER_NORMALIZE_FILENAME if set to true in your settings.py it will make fb strip non standard characters from the file name. I had trouble finding info about it so posting it here enven though not sure if it works for the older version.

1

It appears from looking at the docs that FileBrowser only supports ASCII.

It says in the exception:

Exception Value: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

os.path.join(file_dir, file) is getting a Unicode string, and it's being implicitly encoded to ASCII, rather than UTF-8. The unicode / string changes were made in Python 3 to remove this problem.

Somewhere, file_dir needs to be encoded with file_dir.encode('utf-8'). As a bad hack to make it work, you could try doing it in /web/hvita_perlan/lib/python2.6/site-packages/filebrowser/views.py on line 99:

fileobject = FileObject(os.path.join(file_dir.encode('utf-8'), file))

And then test, and repeat every time you find a new spot in FileBrowser that triggers this error.

agf
  • 171,228
  • 44
  • 289
  • 238
  • I did some research and it looks to me like filebrowser should support utf-8. The hack you suggest does not address the root of the problem. I feel there must be a more simple solution. I had this same site set up on another server before and it worked there. – demux Jul 20 '11 at 23:51
  • Please see http://code.google.com/p/django-filebrowser/issues/detail?id=57 and https://code.djangoproject.com/ticket/10241. Both indicate that non-ASCII characters can break FileBrowser. You just got lucky before and didn't hit the error. In addition, if the docs don't mention Unicode, encoding, or decoding at all, then the program doesn't support Unicode. – agf Jul 21 '11 at 04:09
0

Its an old post but the issue remains.
I'm using django, apache2, django-filebrowser and get this Exception Value: 'ascii' codec can't decode byte 0xc3 in position...

What worked for me even using mod_wsgi.

#https://docs.djangoproject.com/en/1.2/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror
#Put this in your apache2/envvars file.

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

Hope it helps someone.

André Duarte
  • 295
  • 1
  • 11
0

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 -*-
Bart
  • 19,692
  • 7
  • 68
  • 77
demux
  • 4,544
  • 2
  • 32
  • 56
  • 1
    The headers wouldn't fix the problem if the filename was using another encoding than `utf-8`. Unicode support would mean it would work if passed a filename in __any__ encoding Python understood. – agf Jul 21 '11 at 20:10
  • Yeah, that's a good point. I guess people have to be able to use other encodings as well. – demux Jul 22 '11 at 10:35
  • It did help me but I don't think it's the correct answer. So one up for now and I'll give it a thought. ;) – demux Jul 22 '11 at 10:50