2009-08-11 49 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) 

(這樣,每個表單實例化時的目錄進行掃描。)