从Django到PIL Image的ImageField通过HttpResponse发送

时间:2016-07-04 11:15:27

标签: python django image python-imaging-library crop

嗨,我是Django的新手(我是非英语母语人士)。我试图从数据库(ImageField)获取图像(我通过POST获取图像的id),使用PIL Image裁剪图像并通过HttpResponse发送。它没有给出错误但是当我收到图像" piece.jpg"时,它是一个损坏的文件。如果我用记事本打开它,我只能看到:

    <PIL.Image.Image image mode=RGB size=46x75 at 0x3DEA790>

这是views.py中的代码:

    from PIL import Image

    def function(request):

        if request.method == 'POST':

            id = request.POST.get('id')
            object = Document.objects.get(pk=id)

            im = Image.open(object.docfile)

            left = 10
            top = 10
            right = 100
            bottom = 100
            cropped_image = im.crop( (left, top, right, bottom) )

            response = HttpResponse(cropped_image, content_type='image/jpg')
            response['Content-Disposition'] = 'attachment; filename="piece.jpg"'
            return response

我尝试发送&#34; object.docfile&#34;它的工作原理。但是,如果我尝试发送&#34; im&#34; (这是一个PIL图像),它不起作用。

我需要通过HttpResponse发送,因为我希望它可以在该页面上下载。

2 个答案:

答案 0 :(得分:0)

HttpResponse需要字符串或迭代器。文档中的更多细节:

https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpResponse.init

你尝试过这样的事吗?

response = HttpResponse(mimetype='image/jpg')
cropped_image.save(response, "JPEG")
return response

答案 1 :(得分:0)

这帮助我找到了解决方案!你的代码在浏览器中打开图像(这没关系,因为我并没有说我希望它作为下载)。要获得下载对话框,代码为:

    response = HttpResponse(content_type='image/jpg')
    cropped_image.save(response, "JPEG")
    response['Content-Disposition'] = 'attachment; filename="piece.jpg"'
    return response

谢谢亲切的先生:)