2017-09-01 63 views
0

上传日本命名的图像时我收到的错误是:在45-48位置ASCII”编解码器无法编码的字符:在范围内(128)Django的图像上载不能上传日本命名的图像

序数不以英文字符命名时,图片可以完美上传。此外,奇怪的是,我遇到的错误只是当我上传到服务器。日文命名不会在部署服务器上传,但在开发过程中工作正常。

我的模型:

class Tenant_Post(models.Model): 
    user = models.ForeignKey(User,on_delete=models.CASCADE,null=True) 
    name = models.CharField(max_length=255,null=True) 
    image = models.FileField(upload_to='image/tenant/',null=True) 
    posted_on = models.DateTimeField(auto_now_add=True, auto_now=False) 
    last_modified_on = models.DateTimeField(auto_now_add=False, 
    auto_now=True) 

    def __unicode__(self): 
     return self.name 

我的观点:

@login_required(login_url='/') 
def new(request): 
    if request.method == 'POST': 
     print request.POST 
     form = TenantForm(request.POST or None, request.FILES or None) 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      instance.user = request.user 
      instance.save() 
      print 'success' 
      return HttpResponseRedirect(reverse('tenant:all')) 
     else: 
      print 'fail' 
      return render(request,'tenant/new.html',{'form':form,}) 
    else: 
     form = TenantForm() 
     return render(request,'tenant/new.html',{'form':form,}) 

完全溯源是在这里:

File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    41.    response = get_response(request) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "/opt/python/current/app/tenant/views.py" in edit 
    64.     instance.save() 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/db/models/base.py" in save 
    806.      force_update=force_update, update_fields=update_fields) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/db/models/base.py" in save_base 
    836.    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/db/models/base.py" in _save_table 
    900.      for f in non_pks] 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/db/models/fields/files.py" in pre_save 
    296.    file.save(file.name, file.file, save=False) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/db/models/fields/files.py" in save 
    94.   self.name = self.storage.save(name, content, max_length=self.field.max_length) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/files/storage.py" in save 
    53.   name = self.get_available_name(name, max_length=max_length) 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/files/storage.py" in get_available_name 
    77.   while self.exists(name) or (max_length and len(name) > max_length): 

File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/files/storage.py" in exists 
    392.   return os.path.exists(self.path(name)) 

File "/opt/python/run/baselinenv/lib64/python2.7/genericpath.py" in exists 
    26.   os.stat(path) 

Exception Type: UnicodeEncodeError at /tenant/edit/4/ 
Exception Value: 'ascii' codec can't encode characters in position 45-48: ordinal not in range(128) 
+0

ascii不能保存japanise名称,尝试重命名或更改编码 – Vladyslav

+0

我不允许更改名称,可以告诉我更多关于更改编码的信息吗? – jencko

+0

https://stackoverflow.com/questions/36179539/encode-base64-django-imagefield-stream – Vladyslav

回答

1

我还没有与日本语言测试,但它与其他一些语言就像葡萄牙的特殊人物:

添加这对您的settings.py

DEFAULT_FILE_STORAGE = 'app.models.ASCIIFileSystemStorage' 

而且你app.models.ASCIIFileSystemStorage

# This Python file uses the following encoding: utf-8 
from django.db import models 
from django.core.files.storage import FileSystemStorage 
import unicodedata 

class ASCIIFileSystemStorage(FileSystemStorage): 
    """ 
    Convert unicode characters in name to ASCII characters. 
    """ 
    def get_valid_name(self, name): 
     name = unicodedata.normalize('NFKD', name).encode('ascii', 'ignore') 
     return super(ASCIIFileSystemStorage, self).get_valid_name(name) 
+0

它工作的感谢! – jencko

-1

加编码UTF-8则可以接受大多数语言 也到模板html使用字符集utf-8

# -*- coding: UTF-8 -*- in at the top the file 

<meta charset="utf-8"/> in html templates 

编辑: 请阅读官方文档或添加此行

from __future__ import unicode_literals 

https://docs.djangoproject.com/en/1.11/ref/unicode/

+0

抱歉不工作! – jencko

+0

第一个将只定义该模块中文字字符串的编码,第二个将告诉浏览器将内容解释为utf-8编码,这在这里完全不相关(不会修复系统编码),甚至有害如果你的内容不是utf-8编码。另外Django知道如何通过适当的响应头指定有效的编码(在项目的设置文件中使用的编码),所以它在django项目中完全没用。 –

1

你的错误是由os.stat(path)通话,这意味着你的文件系统不支持日文字符(实际上它可能只支持ASCII或一些拉丁-XXX或凸起windows-yyy编码)。

这里主要有两种解决方法:要么将系统配置为在任何地方使用utf-8(无论如何IMVHO都是一个理智的事情),要么确保只对文件系统使用系统编码(或者简单的ascii)名字等(参见leeeandroo的回答)。

+0

它工作正常,但我仍然想知道我如何配置我的系统到处使用utf-8。我在部署在我的AWS EC2而不是在我的开发环境中时遇到了这个问题。 – jencko

+0

我不能帮助AWS,抱歉。 –