Администратор Django загрузит изображение на s3, а затем изменит размер изображения и сохранит проблему с большим пальцем - PullRequest
3 голосов
/ 10 марта 2011

У меня ошибка после ошибки при попытке загрузить и изменить размер изображения на s3 с помощью pil и botos3 и django default_storage. Я пытаюсь сделать это при сохранении в админе.

вот код:

from django.db import models
from django.forms import CheckboxSelectMultiple

import tempfile

from django.conf import settings

from django.core.files.base import ContentFile
from django.core.files.storage import default_storage as s3_storage
from django.core.cache import cache

from datetime import datetime

import Image, os
import PIL.Image as PIL
import re, os, sys, urlparse

class screenshot(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)

    image = models.ImageField(upload_to='screenshots')
    thumbnail = models.ImageField(upload_to='screenshots-thumbs', blank=True, null=True, editable=False)

    def save(self):
        super(screenshot, self).save() # Call the "real" save() method
        if self.image:

            thumb = Image.open(self.image.path)
            thumb.thumbnail(100, 100)

            filename = str(self.slug)

            temp_image = open(os.path.join('tmp',filename), 'w')
            thumb.save(temp_image, 'JPEG')

            from django.core.files import File
            thumb_data = open(os.path.join('/tmp',filename), 'r')
            thumb_file = File(thumb_data)

            new_file.thumb.save(str(self.slug) + '.jpg', thumb_file)


    def __str__(self):
        return self.title

Это только один из многих способов, которыми я пытался заставить его работать, и я получаю (2, «Нет такого файла или каталога») или какую-то другую ошибку.

Пожалуйста, кто-нибудь может помочь мне заставить его работать. Я хочу, чтобы он использовал бэкэнд django, чтобы загруженное изображение было изменено, сохранено как эскиз и затем сохранено. Дайте мне знать, если вам нужно знать какую-либо информацию. Я был бы счастлив использовать фрагмент django - http://djangosnippets.org/snippets/224/, но я не знаю, какие данные для его подачи. Я получаю те же ошибки ввода-вывода и «нет такого пути / имени файла», хотя основное изображение загружается в s3 нормально. Я также пробовал такие вещи, как:

myimage = open(settings.MEDIA_URL + str(self.image)) 
myimage_io = StringIO.StringIO()
imageresize = myimage.resize((100,100), Image.ANTIALIAS)
imageresize.save('resize_100_100_aa.jpg', 'JPEG', quality=75)

Прошло 3 дня поисков, поэтому я начинаю жалеть! Спасибо

Ответы [ 2 ]

7 голосов
/ 09 февраля 2012

У меня была похожая проблема, но в моем случае использование sorl-thumbnail не было возможным. Я обнаружил, что могу открыть изображение непосредственно из S3BotoStorage, передав дескриптор файла вместо пути.

Так что вместо

thumb = Image.open(self.image.path)

использовать

thumb = Image.open(s3_storage.open(self.image.name))

Затем вы можете обработать и сохранить новый файл локально, как вы делали раньше.

5 голосов
/ 13 марта 2011

Почему бы вам не попробовать sorl-thumbnail .У него точно такой же интерфейс, как и у стандартного ImageField, который предоставляет django, и кажется, что работать с ним будет гораздо приятнее, чем поддержка «по-вашему».

  • Поддержка хранилища
  • Поддержка сменного движка (PIL, pgmagick)
  • Поддержка хранилища ключевых значений сменных ключей (redis, cached db)
  • Поддержка сменного бэкэнда
  • Интеграция с администратором с возможностью удаления
  • Генерация пустышки
  • Гибкий, простой синтаксис, не генерирует HTML
  • ImageField для модели, которая удаляет миниатюры
  • Параметры обрезки в стиле CSS
  • Расчет поля длявертикальное расположение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...