使用Django-imagekit在Django中上传Ajax图像

时间:2013-11-19 15:46:26

标签: python ajax django django-imagekit

我一直试图在Django中上传图像文件。我已经遵循了几个教程,它们确实有所帮助,例如this onethe one here

虽然他们确实给出了正在发生的事情/如何思考它的基本概念,但我还不能将其转移到ProcessedImageField的ImageKit实现。

我的问题如下:我有几个ProcessedImageFields。要上传新图片,我使用一个带有稍微修改过的ClearableFileIput小部件的表单,该小部件在标准的“选择文件”按钮上方显示缩略图。这非常好用,用户可以选择几个文件(每个字段一个),保存表单时一次上传所有文件。 我使用S3使用django-storage存储数据。

我希望能够在这些上添加ajax上传功能,以便可以远离表单保存委派图像处理。当用户选择图像时,应该在处理文件后上载并更新图像。然后,只有在用户实际保存表单时才应保留对模型的更改,否则应丢弃新文件。

任何想法从哪里开始寻找?也许有些项目使用Django-Imagekit来使用现有的django ajax库之一?

1 个答案:

答案 0 :(得分:1)

ProcessedImageFields实际上只是在保存图像之前执行图像处理(同步)的普通Django ImageFields,而Django ImageFields实际上只是专门的FileFields。因此,如果您使用的是ProcessedImageFields,那么正常的表单文件处理没有什么不同;任何关于AJAX上传的非Django特定教程都应该同样适用。

就异步处理图像而言,您可以采取两种方法。

第一种方法是使用图像进行一次表单提交,并返回该图像的ID,该ID可以通过第二次提交发送给表单的其余部分。在这种情况下,图像的处理是在服务器端同步完成的,但用户可以在应用程序发生时对其执行其他操作。这使得最终提交更短,因为文件已经发送,但图像处理仍需要在表单成功保存之前完成。您可以尝试查看jQuery-File-Upload的Django示例,但我不确定它们有多好或相关。

另一方面,如果您想在服务器上异步进行图像处理,则会更复杂一些。一种方法是在模型上有两个图像单独的字段 - 一个用于原始图像,另一个用于当前处理的图像。在处理表单提交的视图中,您将原始图像保存在模型中并启动异步任务(使用Celery或类似的东西)处理原始图像,然后将其保存到其他字段。

至于丢弃新文件,您可能必须在定期运行的清理脚本中执行此操作。 (你要问的是图像是保存在服务器上的,但是当它没有保存时​​会被丢弃,但是服务器永远不会被可靠地通知表格没有被保存。)