2011-01-27 80 views
0

綜上所述,我想在這裏完成替換舊文件是:Django的最佳實踐文件上傳

  • 要爲組織和安全起見進行了上傳文件的名稱轉變
  • 不再保留舊的文件永遠在存儲

假設你有一個Company模型有一個標誌。像

class Company(models.Model): 
    name = ... 
    logo = models.FileField(blank=True, null=True) 

現在的東西,因爲我是一個有點偏執,我真的不喜歡那個上傳的文件獲得通過(潛在的邪惡)用戶的名稱是事實,我添加了一個upload_to參數指向一個功能就像

def logo_getfilename(instance, filename): 
    extension = ... # get just the original extension from the file 
    return 'logos/' + str(uuid.uuid4()) + extension 

好的,所以現在只有視圖丟失了!

def company_edit(request, ...): 
    company = ... # get the company and stuff 

    if request.method == 'POST': 
    form = CompanyAdminForm(request.POST, request.FILES, instance=company) 
    last_file_path = None 
    if not company.logo is None: 
     last_file_path = company.logo.path 
    # ^^ after calling is_valid(), file_path gets changed to 
    # the would-be-default-behavior 
    if form.is_valid(): 
     # first we write the new file 
     form.save() 
     # now we remove the old one 
     os.unlink(last_file_path) 

雖然這是目前工作的,我不是因爲

  • 我使用os.unlink()代替FieldFile.delete()這似乎是錯的很舒服
  • 我假設一個本地文件系統存儲
  • 我仍然沒有做任何反對命名衝突的事情(他們可能仍然會發生)
  • 我忽略了多個塊,並假設form.save()負責一切
  • 我不考慮交易行爲(以前的文件應只有在.save()模式變化將提交給數據庫中刪除
  • 我感覺有一些問題,有我甚至不知道

因此,爲了實現這些簡單(並且不那麼罕見)的目標,您的建議是什麼?

回答

0

爲什麼不使用公司的主鍵而不是隨機輸入用戶名?當他們上傳一個新文件時,只需要覆蓋現有的文件(我認爲只要在保存之前更改文件名,它就會自動執行)。這應該刪除您需要做os.unlink和(也許)停止您的交易擔心。