关于python:Django:上传前调整图片大小

Django: resize image before upload

我想在上传前调整图片(枕头)的大小,我写下面的代码但不工作!得到错误:

AttributeError at /myapp/list/

_committed

Request Method: POST

Request URL: http://127.0.0.1:8000/myapp/list/
Django Version: 1.8 Exception Type: AttributeError Exception Value:

_committed

Exception Location:

/usr/local/lib/python3.4/dist-packages/Pillow-2.8.1-py3.4-linux-x86_64.egg/PIL/Image.py

in getattr, line 622 Python Executable: /usr/bin/python3.4 Python
Version: 3.4.0

VIEW

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def list(request):
# Handle file upload
if request.method == 'POST':
    form = DocumentForm(request.POST, request.FILES)
    if form.is_valid():
        imga = request.FILES['docfile']
        size = (600, 400)
        im = Image.open(imga)
        imga = im.resize(size)
        request.FILES['docfile'] = imga
        newdoc = Document(docfile = request.FILES['docfile'], namefile=request.POST['namefile'])
        newdoc.save()

        # Redirect to the document list after POST
        return HttpResponseRedirect(reverse('myproject.myapp.views.list'))
else:
    form = DocumentForm() # A empty, unbound form

# Load documents for the list page
documents = Document.objects.all()

# Render list page with the documents and the form
return render_to_response(
    'myapp/list.html',
    {'documents': documents, 'form': form},
    context_instance=RequestContext(request)
)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile
from resizeimage import resizeimage

class SomeModel(models.Model):
    image = models.ImageField(upload_to=your_get_file_path_callback)

    def save(self, *args, **kwargs):
        pil_image_obj = Image.open(self.image)
        new_image = resizeimage.resize_width(pil_image_obj, 100)

        new_image_io = BytesIO()
        new_image.save(new_image_io, format='JPEG')

        temp_name = self.image.name
        self.image.delete(save=False)  

        self.image.save(
            temp_name,
            content=ContentFile(new_image_io.getvalue()),
            save=False
        )

        super(SomeModel, self).save(*args, **kwargs)

另外,我使用了"python image resize"来调整大小https://github.com/charlesthk/python-resize-image


有一些有用的答案,但您可能希望了解当前代码的情况。

由于此行,您的代码引发了异常:

1
request.FILES['docfile'] = imga

那是怎么回事?您正在将枕头Image对象影响到django ImageField元素。这是两种不同的类型,当您调用Document构造函数时,它可能会找到一个包含_committed属性的文件表单字段。


对于图像大小调整,您可以使用djanof简单缩略图库。

下面是我在项目中使用的示例代码

1
2
options = {'size': (200, 200), 'crop': True}
thumb_url =get_thumbnailer(image path).get_thumbnail(options).url

参考https://github.com/smileychris/easy-thumbnails