python - 在验证和保存表单之前,如何从 ImageField 打开图像?

标签 python django django-forms django-views python-imaging-library

我想根据 ImageField 的值获取 CharField 的值。我的表单和 View 定义为:

#Form
class GpsImForm(forms.Form):
    image = forms.ImageField(required=True)
    gps_data = forms.CharField(required=True)

#View
def gpsim_gen_view(request):
    if request.method == 'POST':
        form = GpsImForm(request.POST, request.FILES)
        if 'image' in request.FILES:
            im = request.FILES['image']
            i = Image.open(im)
            ... # functions to extract exif data from i
            request.POST.update({ 'gps_data': ...}) # set gps_data based on exif data from i
        if form.is_valid():
            obj = form.save()
            return ... #returns the gpsim
    else:
        form = GpsImForm()
    return direct_to_template(request, 'gpsim_generate.html', {'form': form,})

gps_data 已更新,但是,一旦我使用 Image.open(),我就会收到以下错误消息:

Upload a valid image. The file you uploaded was either not an image or a corrupted image.

如果我注释有关i的行并将gps_data修改为任何内容,则表单(带有图像)将被保存而不会出现任何错误...

# i = Image.open(im)
# ...
# functions to extract exif data from i
request.POST.update({ 'gps_data': 'some text'}) # set gps_data to 'test'

最佳答案

首先,确保您的表单具有 enctype 标记

<form enctype="multipart/form-data" ... >    

尝试将img(所有 block )写入磁盘:

import Image
from random import choice
from django.conf import settings

random_file_name = getattr(settings, 'FILE_UPLOAD_TEMP_DIR', '/tmp')
random_file_name +=  '/' + ''.join([choice('abcdefg') for i in range(12)]) + '.jpg'

destination = open(random_file_name, 'wb+')
for chunk in request.FILES['image'].chunks():
    destination.write(chunk)
destination.close()

然后,您可以从磁盘打开它:

image = Image.open(random_file_name)
if image.mode != "RGB":
    image = image.convert("RGB")

...

此网址可能对您有帮助:

https://docs.djangoproject.com/en/dev/topics/http/file-uploads/

关于python - 在验证和保存表单之前,如何从 ImageField 打开图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515060/

相关文章:

python - 自动转义 Django 表单错误

python - Pandas 计算每列的 np.var()

python - 使用 Django Rest Framework 中的 ModelSerializer 和 ModelViewSet 返回通过 POST 创建的新项目的 id

python - 如何在模型级别分页数据(django)

django - 使用 Vue.js、Django Rest Framework 作为后端和/api/在同一服务器上配置 Nginx?

django - 将模型的实例传递给 django 表单集

python - SQLAlchemy 使用合并更新 PostgreSQL 数组不起作用

python - 无法使用category_encoders的fit_transform对我的数据进行序数编码

python - Python 的字符串连接与 str.join 相比有多慢?

django - 将 css 类应用于 forms.RadioSelect 小部件