Django FileField的替代上传方法

use*_*924 8 django file-upload

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

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

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

谢谢你的任何建议!

小智 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
Run Code Online (Sandbox Code Playgroud)

这是一个非常粗略的示例,但它应该可以帮助您弄清楚一些事情。您需要确保您的例程是安全的(例如,格式错误的路径可能允许用户运行他们想要的任何内容)。另外,这可能会在复制文件时阻止 Django 保存例程,因此您应该考虑在单独的进程中运行您首选的命令。

祝你好运!