Django应用程序,可向其他应用程序提供用户友好的多文件/海量文件上传功能

Django应用程序,可向其他应用程序提供用户友好的多文件/海量文件上传功能,django,upload,Django,Upload,老实说,这是我上周在Django用户邮件列表上问的一个问题。因为我还没有收到任何回复,所以我将它重新发布在Stack Overflow上,希望它在这里得到更多关注 我想创建一个应用程序,让它更容易做到用户友好, 在您自己的应用程序中上载多个/海量文件。与用户友好的I 意味着像Gmail、Flickr之类的上传。。。其中,用户可以选择多个 在“浏览文件”对话框中一次浏览文件。然后上传文件 顺序地或并行地以及对所选文件的良好概述 显示在页面上,旁边有一个进度条。“取消” 上传按钮也是一个可能的选项

老实说,这是我上周在Django用户邮件列表上问的一个问题。因为我还没有收到任何回复,所以我将它重新发布在Stack Overflow上,希望它在这里得到更多关注

我想创建一个应用程序,让它更容易做到用户友好, 在您自己的应用程序中上载多个/海量文件。与用户友好的I 意味着像Gmail、Flickr之类的上传。。。其中,用户可以选择多个 在“浏览文件”对话框中一次浏览文件。然后上传文件 顺序地或并行地以及对所选文件的良好概述 显示在页面上,旁边有一个进度条。“取消” 上传按钮也是一个可能的选项

所有这些细节通常都是通过使用Flash对象来解决的。完成 客户端有很多解决方案,比如:SWFUpload ,FancyUpload ,YUI 2上传程序,可能 还有很多

当然,关键在于将这些解决方案集成到您的应用程序中 项目特别是在Django这样的框架中,如果您愿意,可以加倍 它必须是可重复使用的

所以,我有一些想法,但我既不是Django方面的专家,也不是Django方面的专家 基于Flash的上传解决方案。我将在这里分享我的想法,希望 从更有知识和经验的人那里得到一些反馈。 (甚至只是一些“我也想要这个!”回答:)

你会注意到我做了一些假设:这是为了保持 (初始)受控制的应用范围。这些假设 这当然是有争议的:

好吧,到目前为止我的想法是:

  • 如果你想批量上传多个文件,你将有一个 模型中包含每个文件。即,模型将包含一个 文件字段或一个图像字段。 具有多个(当然是有限的)文件字段的模型/ ImageFields不需要简单的批量上传imho:如果你有 有100个文件字段的模型您做错了:) 您希望我设想的大规模上传的示例:

    • 一个应用程序只有一个带有文件字段的模型“宣传册”,即 标题字段(根据文件名动态创建)和添加的日期 场
    • 带有“gallery”和“photo”模型的照片库应用程序。你选一个 用于向其中添加图片、上载图片和新照片对象的图库 创建并将外键设置为所选库
  • 如果能够为您的应用程序配置或扩展应用程序,那就太好了 最喜欢的Flash上传解决方案。我们可以从上面三个选项中选择一个作为 默认设置,但要实现该应用程序,以便人们可以轻松添加 其他实现(有点像Django)可以使用多个 数据库)。让它与任何特定的客户端解决方案无关

  • 如果我们需要选择一个开始,也许选择一个与 最小的足迹?(客户端内容的最小下载量)

  • 基于Flash的解决方案是异步的(或顺序的或 并行)将文件发布到url。我建议url应该是本地的 到我们的通用应用程序(因此,您使用我们的 应用程序(中)。该url将转到我们的通用应用程序提供的视图

  • 视图将执行以下操作:创建新模型实例,添加 文件,可以选择执行额外操作并保存实例

  • DO EXTRA STUFF是使用我们的应用程序想要运行的代码。 如果模型只有一个 FileField/ImageField标准视图代码将执行此任务。 但我认为大多数应用程序都会想做额外的事情,比如填写 其他字段:标题、添加日期、外键、多个

  • 我还没有想到做额外事情的机制。只是 我想到了包装通用应用程序视图,但这不是开发人员的想法 友好,因为您必须编写自己的url模式和 我个人的看法。然后你必须告诉Flash解决方案使用新的url 等 我想这里可以用信号之类的东西

  • Forms/Admin:我仍然非常粗略地了解这一切是如何做到最好的 集成在管理或通用Django表单/widgets/…中。。。 (这就是我缺乏Django经验的原因):

    • 对于Gallery/Photo应用程序: 您可以在Gallery detail上提供一个海量照片上传小部件 形式。但是如果Gallery实例还没有保存呢?档案 上载视图将无法设置照片上的外键 实例。我看到auth应用程序在创建用户时首先会询问 用于用户名和密码,只有这样才能为您提供更大的 填写电子邮件地址、选择角色等的表单。我们可以执行以下操作 那个
    • 对于只有一个型号的应用程序: 如何在Django管理员中提供一个表单来进行弥撒 上传?你不能用你模型的细节形式来做,这很简单 仅针对一个模型实例
在这之前,可能还有几十个问题需要回答 我甚至可以启动这个应用程序。所以请告诉我你的想法!给予 我输入!你喜欢什么?什么不可以?你会有什么不同?是 这个主意可靠吗?它不在哪里


谢谢大家!

大约一个月前,我刚刚发布了一个简单的应用程序:

它基本上是一个Django模板标记,充当非常漂亮(需要jQuery)的包装器。使用它就像将它添加到模板一样简单

{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}
该标记将在客户端和服务器端(Django信号)触发事件(每个文件1个),以指示何时接收到传入文件

例如,假设您有一个处理所有用户上传文件的“媒体”模型

def upload_received_handler(sender, data, **kwargs):
    if file:
        new_media = Media.objects.create(
            file = data,
            new_upload = True,
        )
        new_media.save()

upload_recieved.connect(upload_received_handler, dispatch_uid=‘whatever.upload_received’)
查看以获取有关如何设置和创建信号处理程序(客户端/服务器)的信息


关于上述概念实现,这里有几点需要考虑:

  • 让应用程序自动创建“文件模型”实例可能不如人们在工作时已经拥有自己的模型那么健壮