Преобразование изображения Python pil в поле изображения django

Я загружаю изображение, загрузка изображения и сохранение его в модели django работает нормально. Создание эскиза и сохранение его в файле temp. местоположение тоже работает. Часть, которая не работает, - это сохранение эскиза, файл создается и сохраняется, но это пустой файл. :/ Как я могу решить проблему с отсутствующими данными.

Если кто-то знает, как преобразовать изображение pil в модель django - поле изображения без сохранения tmp ... расскажите, пожалуйста.

def ajax_upload(request):
    if request.method == 'POST':
        newfile = Image()
        newfile.user = request.user
        file_content = ContentFile(request.raw_post_data)
        file_name = request.GET.get('file')

        newfile.image.save(file_name, file_content)

        # thumbnail creation ==========================================
        path = os.path.join(settings.MEDIA_ROOT, newfile.image.url)
        thumb_image = pil_image.open(path)

        # ImageOps compatible mode
        if thumb_image.mode not in ("L", "RGB"):
            thumb_image = thumb_image.convert("RGB")

        thumb_image_fit = ImageOps.fit(thumb_image, (32, 32), pil_image.ANTIALIAS)

        #saving temp file
        tmp_file_path = os.path.join(settings.MEDIA_ROOT, 'tmp_thumbnail.jpg')
        thumb_image_fit.save(tmp_file_path, 'JPEG', quality=75)

        #opening the tmp file and save it to django model
        thumb_file_data = open(tmp_file_path)
        thumb_file = File(thumb_file_data)

        newfile.thumbnail.save(file_name, thumb_file)
        #===============================================================

        results = {'url': newfile.image.url, 'id': newfile.id, 'width': newfile.image.width, 'height': newfile.image.height}
        return HttpResponse(json.dumps(results))
    raise Http404

person Aleksandrenko    schedule 17.04.2012    source источник


Ответы (1)


Вы можете сохранить файл и вручную указать его путь (относительно MEDIA_ROOT) в поле назначения.

thumb_path = 'uploads/1_small.jpg'
thumb_image_fit.save(os.path.join(MEDIA_ROOT, thumb_path), 'JPEG', quality=75)
newfile.thumbnail = thumb_path

Конечно, вам придется делать все вещи Django вручную — проверять, существует ли файл, изменять имя, если оно существует, и так далее.

person ilvar    schedule 18.04.2012
comment
Я не могу проверить это сейчас, но newfile.thumbnail — это ImageField, и я не думаю, что «newfile.thumbnail = thumb_path» будет в порядке. Если я правильно понял, поле изображения сохраняется следующим образом: - person Aleksandrenko; 18.04.2012
comment
Да, obj.field.save(name, content) более правильный и официально задокументированный способ. Но FileField хранит только путь в базе данных и позволяет назначать этот путь напрямую. Это недокументированная функция, но она работает. - person ilvar; 19.04.2012
comment
Спасибо, запомню на будущее. - person Aleksandrenko; 19.04.2012