2016-10-12 69 views
1

我想爲用戶上傳的文件添加一些驗證。這需要通過一個我稱爲「sumpin」的自定義腳本來運行,該腳本僅將文件路徑作爲變量併發回將驗證的JSON數據。我的腳本中的所有內容都是獨立工作的,將它們放在發生錯誤的地方。
在Django中,上傳時如何獲取上傳文件的文件路徑?

由於這是文件驗證,我決定展開我已經工作的file_extension驗證器。

models.py

from allauthdemo.fileuploadapp.slic3rcheck import sumpin 

def user_directory_path_files(instance, filename): 
    return os.path.join('uploads', str(instance.objectid), filename) 


def validate_file_extension(value): 
    ext = os.path.splitext(value.name)[1] 
    valid_extensions = ['.stl','.STL'] 
    if not ext in valid_extensions: 
     raise ValidationError(u'Please upload a .stl file type only') 

    data = sumpin(value.path) 

    print (data) 


class subfiles(models.Model): 
    STL = models.FileField(_('STL Upload'), 
    upload_to=user_directory_path_files, validators=[validate_file_extension]) 

的錯誤,我得到的是路徑(value.path)無效。

這是不正確的路徑,因爲upload_to標籤必須在以後更改此路徑。這可能很明顯,但我還需要在調用腳本時將文件放在文件路徑位置。所以基本上我的問題是...

  1. 如何將「upload_to」路徑傳入我的驗證器來運行我的自定義腳本?
  2. 有沒有更好的方法來處理上傳的文件,比如在帶有「保存」或「乾淨」功能的主類中?

回答

0

我已經找到了我自己的答案,但是我會在這裏發佈它,以防有人在將來遇到此問題。

我錯了,驗證器實際上不會下載文件。我需要使用文件上傳處理程序,如下所示。

import os 
from django.core.files.storage import default_storage 
from allauthdemo.fileuploadapp.slic3rcheck import sumpin 



def handle_uploaded_file(f): 
    with open(default_storage.path('tmp/'+f.name), 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

    data = sumpin(default_storage.path('tmp/'+f.name)) 
    os.remove(default_storage.path('tmp/'+f.name)) 
    return data 

然後我在我的views.py中調用這個。

from allauthdemo.fileuploadapp.uploadhandler import handle_uploaded_file 

@login_required 
def STLupload(request): 
    # Handle file upload 
    if request.method == 'POST': 
     formA = ObjectUp(request.POST, request.FILES) 
     if formA is_valid(): 
      data = handle_uploaded_file(request.FILES['STL']) 

這將返回我在handle_upload_file中返回的任何內容,這對我的問題非常適用。希望有人會發現這對未來有用。

相關問題