2016-11-17 4 views
7

私はdjangoアプリケーションを作成して、フォームのあるファイルのディレクトリをアップロードしています。Djangoディレクトリのアップロードサブディレクトリ名を取得

これは私がディレクトリのアップロードを可能に使用しています形式です:

class FileFieldForm(forms.Form): 
    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs= 
     {'multiple': True, 'webkitdirectory': True, 'directory': True})) 

これは、生のポストペイロードである:

------WebKitFormBoundaryPbO3HkrKGbBwgD3sd1 
Content-Disposition: form-data; name="csrfmiddlewaretoken" 

F575Bgl4U9dzgwePPeSW2ISZKk5c3CnRoqFasdasD0Hep6nD0LnAAObXbF92SUa96NbO2 
------WebKitFormBoundaryPbO3HkrKGbBwgDsd31 
Content-Disposition: form-data; name="file_field"; 
filename="MainDir/SubDir1/1.jpg" 
Content-Type: image/jpeg 


------WebKitFormBoundaryPbOasd3HkrKGbBwgD31 
Content-Disposition: form-data; name="file_field"; 
filename="MainDir/SubDir2/2.jpg" 
Content-Type: image/jpeg 

これは、フォームを処理するための図である。

class FileFieldView(FormView): 
    form_class = FileFieldForm 
    template_name = 'upload.html' 
    success_url = 'upload' 

    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     files = request.FILES.getlist('file_field') 
     if form.is_valid(): 
      for f in files: 
       pprint("Name of file is " + f._get_name() + ' ' + f.field_name, sys.stderr) 
       new_file = FileModel(file=f) 
       new_file.save() 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

問題は、djangoのファイルオブジェクトの名前にサブディレクトリ名がないことです。私は、ミドルウェアの処理要求の1つが、ファイル名からサブディレクトリ名を解析して削除していると仮定しています。ディレクトリ名とサブディレクトリ名を持つ元のファイル名を取得する方法はありますか?

答えて

3

これはDjangoの実装方法です。 Django's Upload Handler docを参照してください。

デフォルトのアップロードハンドラーはMemoryFileUploadHandlerTemporaryFileUploadHandlerです。どちらもファイルの処理にUploadedFileを使用しており、ファイルのベース名をとる関数_set_nameを持っています。

def _set_name(self, name): 
    # Sanitize the file name so that it can't be dangerous. 
    if name is not None: 
     # Just use the basename of the file -- anything else is dangerous. 
     name = os.path.basename(name) 

     # File names longer than 255 characters can cause problems on older OSes. 
     if len(name) > 255: 
      name, ext = os.path.splitext(name) 
      ext = ext[:255] 
      name = name[:255 - len(ext)] + ext 

    self._name = name 

しかし、私はあなたがベース名を取り、あなたが望むように動作していない、独自のアップロード・ハンドラを書くことができることができると思う:

はしても、それがベース名を取る理由を言ったコメントがあります。ここに少しの情報があります。custom upload handlerと書くことができます。

ハンドブックをFILE_UPLOAD_HANDLERSに設定する必要があります。

+1

感謝素晴らしいフォーマットのために@Moinuddin Quadri –

+1

私はドキュメントからこれを逃した。私はこれを試してみる、それは動作するはずです。 – pratsJ

0

前の回答を拡張し、ディレクトリのアップロードからフルパスを得るための一つの方法は、ハイフンで(離れて消毒ます)ファイルパスにスラッシュ(\/)を置き換えることにより、次のとおりです。

class CustomMemoryFileUploadHandler(MemoryFileUploadHandler): 
    def new_file(self, *args, **kwargs): 
     args = (args[0], args[1].replace('/', '-').replace('\\', '-')) + args[2:] 
     super(CustomMemoryFileUploadHandler, self).new_file(*args, **kwargs) 

class CustomTemporaryFileUploadHandler(TemporaryFileUploadHandler): 
    def new_file(self, *args, **kwargs): 
     args = (args[0], args[1].replace('/', '-').replace('\\', '-')) + args[2:] 
     super(CustomTemporaryFileUploadHandler, self).new_file(*args, **kwargs) 

@csrf_exempt 
def my_view(request): 
    # replace upload handlers. This depends on FILE_UPLOAD_HANDLERS setting. Below code handles the default in Django 1.10 
    request.upload_handlers = [CustomMemoryFileUploadHandler(request), CustomTemporaryFileUploadHandler(request)] 
    return _my_view(request) 

@csrf_protect 
def _my_view(request): 
    # if the path of the uploaded file was "test/abc.jpg", here it will be "test-abc.jpg" 
    blah = request.FILES[0].name 
関連する問題