Django FileField的替代上传方法

时间:2009-08-11 15:55:51

标签: django file-upload

我有一些使用FileField的django模型,用户一直在管理界面中上传文件。我们现在有一个问题,一些文件很大(1-3G),这使得http上传很棘手。

有一个“容器”类,然后带有FK的“文件”类到容器。我在admin gui中使用了内联来使用户更容易(容器类窗体,带有文件类内联)

我找到了FilePathField,我认为将用户scp / rsync文件转发到服务器然后浏览并向其添加详细信息会很有用,但我怎样才能在管理员中获取此信息?我是否需要构建一个创建对象的新表单/视图?有没有办法以某种方式在自定义管理表单中覆盖模型(从而保持所有免费管理员的优点),用filepathfield替换文件字段?还有其他建议吗?

感谢您的任何建议!

3 个答案:

答案 0 :(得分:2)

您提到FilePathField有效,但需要重新启动网络服务器以查看新文件。发生这种情况是因为选项被收集FilePathField.__init__,在导入模块时称为一次

修复方法是重新调用表单__init__中的字段__init__

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

(这样每次表单实例化时都会扫描目录。)

答案 1 :(得分: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保存例程,因此您应该在单独的过程中查看运行首选命令。

祝你好运!

答案 2 :(得分:0)

我不是传输大文件的专家,但如果你的用户需要能够在没有“UNIX咒语”的情况下做到这一点,我建议考虑为它创建一个Java applet。这将是很多工作,但是你可以有适当的进度条等。