title: UnicodeEncodeError when uploading files in Django admin
body: <p>My question is similar to the one reported <a href="https://stackoverflow.com/questions/3715865/unicodeencodeerror-ascii-codec-cant-encode-character/7602446#7602446">here</a>, but the proposed solution doesn't work for me. I'm trying to upload a file called 'Testaråäö.txt' via the Django admin app.</p>
  
  <p>I'm running Django 1.3.1 with Gunicorn 0.13.4 and Nginx 0.7.6.7 on a Debian 6 server. Database is PostgreSQL 8.4.9. Other Unicode data is saved to the database with no problem, so I guess the problem must be with the filesystem somehow.</p>
  
  <p>I've set</p>
  
  <pre><code>http {
      charset utf-8;
  }
  </code></pre>
  
  <p>in my nginx.conf. LC_ALL and LANG is set to 'sv_SE.UTF-8'. Running 'locale' verifies this. I even tried setting LC_ALL and LANG in my nginx init script just to make sure locale is set properly.</p>
  
  <p>Here's the traceback:</p>
  
  <pre><code>Traceback (most recent call last):
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/handlers/base.py", line 111, in get_response
  response = callback(request, *callback_args, **callback_kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/options.py", line 307, in wrapper
  return self.admin_site.admin_view(view)(*args, **kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 93, in _wrapped_view
  response = view_func(request, *args, **kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/views/decorators/cache.py", line 79, in _wrapped_view_func
  response = view_func(request, *args, **kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/sites.py", line 197, in inner
  return view(request, *args, **kwargs)
  
  File "/srv/django/letebo/app/cms/admin.py", line 81, in change_view
  return super(PageAdmin, self).change_view(request, obj_id)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 28, in _wrapper
  return bound_func(*args, **kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 93, in _wrapped_view
  response = view_func(request, *args, **kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 24, in bound_func
  return func(self, *args2, **kwargs2)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/transaction.py", line 217, in inner
  res = func(*args, **kwargs)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/options.py", line 985, in change_view
  self.save_formset(request, form, formset, change=True)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/options.py", line 677, in save_formset
  formset.save()
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/forms/models.py", line 482, in save
  return self.save_existing_objects(commit) + self.save_new_objects(commit)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/forms/models.py", line 613, in save_new_objects
  self.new_objects.append(self.save_new(form, commit=commit))
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/forms/models.py", line 717, in save_new
  obj.save()
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/base.py", line 460, in save
  self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/base.py", line 504, in save_base
  self.save_base(cls=parent, origin=org, using=using)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/base.py", line 543, in save_base
  for f in meta.local_fields if not isinstance(f, AutoField)]
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/fields/files.py", line 255, in pre_save
  file.save(file.name, file, save=False)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/fields/files.py", line 92, in save
  self.name = self.storage.save(name, content)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/files/storage.py", line 48, in save
  name = self.get_available_name(name)
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/files/storage.py", line 74, in get_available_name
  while self.exists(name):
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/files/storage.py", line 218, in exists
  return os.path.exists(self.path(name))
  
  File "/srv/.virtualenvs/letebo/lib/python2.6/genericpath.py", line 18, in exists
  st = os.stat(path)
  
  UnicodeEncodeError: 'ascii' codec can't encode characters in position 52-54: ordinal not in range(128)
  </code></pre>
  
  <p><strong>UPDATE:</strong> I tried running Gunicorn with debugging turned on, and the file uploads without any problem at all. I suppose this must mean that the issue is with Nginx. Still beats me where to look, though. Here are the raw response headers from Gunicorn and Nginx, if it makes any sense:</p>
  
  <p>Gunicorn:</p>
  
  <pre><code>HTTP/1.1 302 FOUND
  Server: gunicorn/0.13.4
  Date: Thu, 09 Feb 2012 14:50:27 GMT
  Connection: close
  Transfer-Encoding: chunked
  Expires: Thu, 09 Feb 2012 14:50:27 GMT
  Vary: Cookie
  Last-Modified: Thu, 09 Feb 2012 14:50:27 GMT
  Location: http://my-server.se:8000/admin/cms/page/15/
  Cache-Control: max-age=0
  Content-Type: text/html; charset=utf-8
  Set-Cookie: messages="yada yada yada"; Path=/
  </code></pre>
  
  <p>Nginx:</p>
  
  <pre><code>HTTP/1.1 500 INTERNAL SERVER ERROR
  Server: nginx/0.7.67
  Date: Thu, 09 Feb 2012 14:50:57 GMT
  Content-Type: text/html; charset=utf-8
  Transfer-Encoding: chunked
  Connection: close
  Vary: Cookie
  
  500
  </code></pre>