从Django shell上传图像
我需要把一堆图片导入到一个Django应用里。我在测试的时候在命令行中遇到了一个错误,无法保存图片:
File "/lib/python3.3/codecs.py", line 301, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0:
invalid start byte
这是模型:
import uuid
from django.db import models
from taggit.managers import TaggableManager
import os
def generate_filename(instance, filename):
f, ext = os.path.splitext(filename)
name = uuid.uuid4().hex
return 'images/%s%s' % (name, ext)
class StudyImage(models.Model):
pic = models.ImageField(upload_to=generate_filename)
upload_date = models.DateTimeField(auto_now_add=True)
tags = TaggableManager()
出现错误的步骤:
打开一个Django命令行。
import uuid
import os
from app import models
p = File(open('/home/image001.png', 'r'))
a = models.StudyImage(pic=p)
a.pic.save('test.jpg',p)
这时就会出现上面的错误。我搞不懂为什么图片会出现unicode编码错误……我是参考了“从Django命令行上传文件”这篇文章才走到这一步的。
更多细节:
Django 1.7,Python 3.3
完整的错误追踪信息:
Traceback (most recent call last):<br>
File "<input>", line 1, in <module><br>
File "/home/s/Pycharm/flf/venv/lib/python3.3/site-
packages/django/db/models/fields/files.py", line 89, in save
self.name = self.storage.save(name, content)
File "/home/s/Pycharm/flf/venv/lib/python3.3/site-
packages/django/core/files/storage.py", line 51, in save
name = self._save(name, content)
File "/home/s/Pycharm/flf/venv/lib/python3.3/site-
packages/django/core/files/storage.py", line 224, in _save
for chunk in content.chunks():
File "/home/s/Pycharm/flf/venv/lib/python3.3/site-packages/django/core/files/base.py",
line 77, in chunks
data = self.read(chunk_size)
File "/home/s/Pycharm/flf/venv/lib/python3.3/codecs.py", line 301, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
1 个回答
21
我之前也遇到过这个问题,所以我很理解你的感受。不过,正如我在评论中提到的:把 'r'
替换成 'rb'
在 File() 调用中,这样就应该没问题了。
我还想补充一下,给以后看到这个答案的人,这个问题是特定于 Python3 的。可以看看 Steve 评论中的 SO 链接,那里对 File()
在 Python2 和 Python3 之间的区别做了更详细的解释。