как сжать изображение перед загрузкой на s3 в django? - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над приложением, в котором пользователь может загрузить изображение. Я хочу уменьшить размер изображения на 200-500кб. Это мой файл models.py

class Report_item(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=255, help_text='*Title for the post e.g. item identity')
    image = models.ImageField(default="add Item image",
                          upload_to=get_uplaod_file_name)


    def __str__(self):
        return self.title + "      " + str(self.publish)

А это мой файл views.py

class ReportCreate(generic.CreateView):
model = Report_item
fields = ['title','image']

def get_form(self, form_class=None):
    if form_class is None:
        form_class = self.get_form_class()
    form = super(ReportCreate, self).get_form(form_class)
    form.fields['title'].widget = TextInput(
        attrs={'placeholder': '*Enter UID e.g. CBSE Marksheet Roll nunber 0506***'})
    return form

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.owner = self.request.user
    self.object.save()
    return FormMixin.form_valid(self, form)

Я использую хранилище Django 1.11 и S3. Пожалуйста, помогите мне сжать изображение перед загрузкой на s3.

1 Ответ

0 голосов
/ 05 сентября 2018

Итак, нам нужно определить метод сохранения в моделях, чтобы сжать изображение перед сохранением. Следующий код поможет мне достичь того, чего я хочу добиться.

class Report_item(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=255, help_text='*Title for the post e.g. item identity')
    
    image = models.ImageField(default="add Item image",
                              upload_to=get_uplaod_file_name)

    def save(self):
        # Opening the uploaded image
        im = Image.open(self.image)

        output = BytesIO()

        # Resize/modify the image
        im = im.resize((100, 100))

        # after modifications, save it to the output
        im.save(output, format='JPEG', quality=90)
        output.seek(0)

        # change the imagefield value to be the newley modifed image value
        self.image = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % self.image.name.split('.')[0], 'image/jpeg',
                                        sys.getsizeof(output), None)

        super(Report_item, self).save()

С помощью этого 5 Мб изображения сжимается до 4 Кбайт.

...