I am writing a django app to upload a directory of files with forms.
This is the form I am using which allows upload of directory:
class FileFieldForm(forms.Form):
file_field = forms.FileField(widget=forms.ClearableFileInput(attrs=
{'multiple': True, 'webkitdirectory': True, 'directory': True}))
This is the raw post payload:
------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
This is the view to handle form:
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)
Problem is that name of file object in django is without sub-directory names. I am assuming one of the middleware handling request is parsing and removing subdirectory names from filename. Is there way I can get the original filename that has directory and sub-directory names?
I believe this is how Django is implemented. Please refer to Django's Upload Handler doc.
It has its default upload handlers
MemoryFileUploadHandlerandTemporaryFileUploadHandler. Both of them are using theUploadedFilefor handling the files, and it has a function_set_name, which takes the base name of the file.Even there is a comment saying why it takes the basename:
But I think you can can write your own upload handler which doesn't take the basename and behaves as you want. Here is little info how you can write custom upload handler.
Then you need to define your handler in
FILE_UPLOAD_HANDLERSsetting.EDIT Custom Upload Handlers with Django 3.1