如果用户上传了一张图片,并且我使用 PIL 调整了它的大小,我会得到一个PIL Image object。
PIL Image
在将文件保存到数据库之前,如何在模板中显示文件?它甚至可以作为图像传入并渲染吗?
如果用户上传了一张图片,并且我使用 PIL 调整了它的大小,我会得到一个PIL Image object。
PIL Image
在将文件保存到数据库之前,如何在模板中显示文件?它甚至可以作为图像传入并渲染吗?
对于有限的浏览器集,您可以对图像进行 base64 编码并使用内联图像。请参阅嵌入 Base64 图像。
适用于所有浏览器的解决方案是引用返回图像的视图的图像标记。
[更新]
我想要的只是让用户提交原始图像,然后由另一个表单提示输入图像的标题(调整大小的图像位于标题字段的左侧)。然后,当用户点击“提交”时,图像和标题会保存在模型实例中。
好吧...当您使用时<img src="foo">
, foo 总是由 GET 检索,也许这就是它不起作用的原因 - request.FILES 在 GET 请求中将不可用。如果您打开 firebug 或 chrome 调试工具栏,在网络选项卡中,您将看到带有上传图像的 POST 请求,然后是获取图像的 GET 请求。
您必须将图像保存在两个步骤之间的某个位置。
我还能怎么保存它?我希望它是暂时的。您认为有一种非常简单的方法可以做到这一点,还是我应该研究这些选项?
流行的选择是redis和memcached。您可以将它们视为具有过期日期的巨型共享 python dict。如果图像很小,例如头像,您还可以将图像数据保存在会话变量中。
是和不是。
是的,您可以将图像作为原始 Base64 数据。这是一个可以用来测试的小脚本:
import Image
import base64
import StringIO
output = StringIO.StringIO()
im = Image.open("test.png") # Your image here!
im.save(output, format='PNG')
output.seek(0)
output_s = output.read()
b64 = base64.b64encode(output_s)
open("test.html","w+").write('<img src="data:image/png;base64,{0}"/>'.format(b64))
然而,这是一个非常糟糕的主意。如果有多个缩略图,您的单个 HTML 页面可能会超过 10MB。
您真正应该做的是使用单独的 Django 视图将来自 PIL 对象的图像作为 PNG 文件返回,然后在img
href
页面的属性中引用该视图。
您可以将 base64 编码的图像嵌入到标签中。所以你可以将 PIL 图像转换为 base64 然后显示它。
from PIL import Image
import StringIO
x = Image.new('RGB',(400,400))
output = StringIO.StringIO()
x.save(output, "PNG")
contents = output.getvalue().encode("base64")
output.close()
contents = contents.split('\n')[0]
然后显示:
<img src="data:image/png;base64,' + contents + ' />
查看示例输出。