2016-11-17 23 views
7

Tôi đang viết một ứng dụng django để tải lên một thư mục tệp có biểu mẫu.Tải lên thư mục Django nhận tên thư mục con

Đây là hình thức Tôi đang sử dụng mà cho phép tải lên các thư mục:

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

Đây là bài thô trọng tải:

------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 

Đây là quan điểm để xử lý hình thức:

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) 

Vấn đề là tên đối tượng tệp trong django không có tên thư mục con. Tôi giả định một trong những yêu cầu xử lý phần mềm trung gian là phân tích cú pháp và loại bỏ tên thư mục con khỏi tên tệp. Có cách nào tôi có thể lấy tên tập tin gốc có tên thư mục và thư mục con không?

Trả lời

3

Tôi tin rằng đây là cách Django được triển khai. Vui lòng tham khảo Django's Upload Handler doc.

Trình xử lý tải lên mặc định của nó là MemoryFileUploadHandlerTemporaryFileUploadHandler. Cả hai người trong số họ đang sử dụng UploadedFile để xử lý các tệp và có chức năng _set_name, có tên cơ sở của tệp.

Thậm chí có một bình luận nói rằng tại sao phải mất basename:

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 

Nhưng tôi nghĩ bạn có thể có thể viết handler upload riêng của bạn mà không mất basename và hoạt động như bạn muốn. Dưới đây là ít thông tin về cách bạn có thể viết custom upload handler.

Sau đó, bạn cần xác định trình xử lý của mình trong cài đặt FILE_UPLOAD_HANDLERS.

+1

Cảm ơn cho định dạng đẹp @Moinuddin Quadri –

+1

Tôi đã bỏ lỡ tài liệu này. Tôi sẽ thử nó, nó sẽ hoạt động. – pratsJ

0

Mở rộng trên câu trả lời trước, một trong những cách để nhận được đường dẫn đầy đủ từ một thư mục tải lên là bởi dấu thay thế (\/) trong đường dẫn tập tin (mà có được vệ sinh đi) với dấu gạch nối:

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 
Các vấn đề liên quan