我要说实话:这是我上周在Django-Users邮件列表上提出的一个问题.由于我还没有得到任何回复,我将它重新发布在Stack Overflow上,希望它能在这里获得更多关注.
我想创建一个应用程序,使您可以轻松地在自己的应用程序中进行用户友好,多个/大量文件上传.用户友好,我的意思是上传,如Gmail,Flickr,...用户可以在浏览文件对话框中一次选择多个文件.然后按顺序或并行上载文件,并在页面上显示所选文件的精美概述,旁边有进度条."取消"上传按钮也是一种可能的选择.
所有这些好处通常都是通过使用Flash对象来解决的.完整的解决方案是在那里的客户端,如:SWFUpload的 http://swfupload.org/,FancyUpload http://digitarald.de/project/fancyupload/ ,YUI 2提供者http://developer.yahoo.com/yui/uploader /可能还有更多.
当然,诀窍是将这些解决方案集成到您的项目中.特别是在像Django这样的框架中,如果你希望它可以重复使用,请加倍.
所以,我有一些想法,但我既不是Django的专家,也不是基于Flash的上传解决方案.我将在这里分享我的想法,希望从更有知识和经验丰富的人那里获得一些反馈.(或者甚至只是一些'我也想要这个!'回复:))
您会注意到我做了一些假设:这是为了控制应用程序的(初始)范围.这些假设当然值得商榷:
好吧,我的想法到目前为止:
如果要批量上传多个文件,您将拥有一个包含每个文件的模型.即模型将包含一个FileField或一个ImageField.具有多个(但有限量)FileFields/ImageFields的模型不需要轻松大量上传imho:如果你有一个带有100个FileFields的模型你做错了什么:)你想要我想象的那种大量上传的例子:
能够为您喜爱的Flash上传解决方案配置或扩展应用程序会很不错.我们可以选择上面三个中的一个作为默认值,但实现应用程序,以便人们可以轻松添加其他实现(有点像Django可以使用多个数据库).让它与任何特定的客户端解决方案无关.
如果我们需要选择一个开头,也许选择占地面积最小的那个?(最小的客户端东西下载)
基于Flash的解决方案异步(并且顺序或并行)将文件POST到URL.我建议将url设置为我们的通用应用程序的本地(因此,对于您使用我们的应用程序的每个应用程序,它都是相同的).该网址将转到我们的通用应用提供的视图.
该视图将执行以下操作:创建新模型实例,添加文件,OPTIONALLY DO EXTRA STUFF并保存实例.
DO EXTRA STUFF是使用我们的应用程序的应用程序想要运行的代码.它不必提供任何额外的代码,如果模型只有FileField/ImageField,标准视图代码将完成这项工作.但大多数应用程序都希望做更多我认为的东西,比如填写其他字段:title,date_added,foreignkeys,manytomany,...
我还没有想过DO EXTRA STUFF的机制.只想包装通用应用程序视图,但这不是开发人员友好的,因为您必须编写自己的url模式和自己的视图.然后你必须告诉Flash解决方案使用一个新的URL等...我觉得像这样的信号可以在这里使用?
表单/管理员:我仍然非常粗略地说明如何将所有这些最好地集成到Admin或通用Django表单/窗口小部件/ ...(这是我缺乏Django体验节目):
在我开始使用这个应用程序之前,可能还有几十个问题需要回答.所以请告诉我你的想法!给我输入!你喜欢什么?什么不是?你会做什么不同的?这个想法是否稳固?它不在哪里?
谢谢!
T. *_*one 12
我刚刚在一个月前发布了一个简单的应用程序:django-uploadify.
它基本上是一个Django模板标记,充当非常漂亮的Uploadify(需要jQuery)的包装器.使用它就像将其添加到模板一样简单......
{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}
Run Code Online (Sandbox Code Playgroud)
标记将在客户端和服务器端(Django信号)触发事件(每个文件1个),以指示何时收到传入文件.
例如,假设您有一个模型'Media'来处理所有用户上传的文件......
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’)
Run Code Online (Sandbox Code Playgroud)
查看Wiki以获取有关如何设置和创建信号处理程序(客户端/服务器)的信息.
关于上面的概念实现,这里有几点需要考虑:
| 归档时间: |
|
| 查看次数: |
4932 次 |
| 最近记录: |