2009-08-11 101 views
8

我有一些使用FileField的Django模型,并且用户一直在管理界面中上传文件。我们现在有一个问题,一些文件相当大(1-3G),这使http上传变得棘手。Django FileField的替代上传方法

有一个“容器”类,然后是“文件”类与FK的容器。我已经在管理gui中使用内联以使用户更容易(容器类表单,带有文件类内联)

我已经找到FilePathField,我想这将有助于让用户将scp/rsync文件转移到服务器,然后浏览并向他们添加详细信息,但是如何在管理员中获得此信息?我是否需要构建一个创建对象的新窗体/视图?有没有办法以某种方式覆盖自定义管理表单中的模型(并因此保留所有免费管理的优点),用filepathfield替换文件区?还有其他建议吗?

感谢您的任何建议!

+1

好奇,想看看是什么回应是,我需要很快处理这个相同的问题 - 大量文件从100-200mb,通过管理员上传到S3。 – 2009-08-11 23:05:42

+0

我用FilePathField做了一个表单,它工作正常,但需要重新加载Web服务器才能看到新文件:/ - 仍在寻找替代方法! – user130924 2009-08-14 11:10:50

回答

0

我不知道我是否理解你想包含在管理区域中。您是否正在寻找一种使用HTTP以外的传输协议自动执行文件上传过程的方法?

如果是这样,您可以使用基本CharField(或可能是URLField)创建模型,然后在保存对象时执行rsync或scp复制。例如:

from django.db import models 

class File(models.Model): 
    path = models.CharField() 
    def save(self): 
     import os 
     # WARNING! The path given by the user should be sanitized; this is 
     # example code only. This is a security vulnerability. 

     # Attempt to rsync the target file from a remote machine 
     exit_code = os.system("rsync %s /incoming/files/path/" % self.path) 
     # Make sure it worked before saving 
     if exit_code == 0: 
     super(File, self).save() # Call the "real" save() method 
     else: 
     # Raise exception 

这是一个非常粗略的例子,但它应该可以帮助您计算出某些东西。您需要确保您的例程安全(格式不正确的路径可能允许用户运行任何他们想要的内容)。此外,这可能会阻止Django保存例程,同时复制文件,因此您应该查看在单独的进程中运行您的首选命令。

祝你好运!

0

我并不擅长传输大文件,但如果您的用户需要能够在没有“UNIX咒语”的情况下执行此操作,我会建议您考虑为它创建一个Java小程序。这将是很多工作,但那么你可以有适当的进度条等

2

你提到FilePathField的作品,但需要重新启动Web服务器才能看到新的文件。发生这种情况的原因是收集的选项为FilePathField.__init__,在模块导入时称为一次

一个解决将是重新调用领域的__init__形式的__init__

def __init__(self, **kwargs): 
    super(MyForm, self).__init__(**kwargs) 
    self.fields['file'].__init__(path) 

(这样,每个表单实例化时的目录进行扫描。)