Django目录上传获取子目录名称

pra*_*tsJ 7 python django file-upload django-forms directory-upload

我正在编写一个django应用程序来上传带有表单的文件目录.

这是我正在使用的表单,允许上传目录:

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

这是原始邮件有效负载:

------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
Run Code Online (Sandbox Code Playgroud)

这是处理表单的视图:

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)
Run Code Online (Sandbox Code Playgroud)

问题是django中文件对象的名称没有子目录名.我假设其中一个中间件处理请求正在解析并从filename中删除子目录名称.有没有办法我可以获得具有目录和子目录名称的原始文件名?

Gag*_*yan 6

我相信这就是 Django 的实现方式。请参阅Django 的上传处理程序文档

它有默认的上传处理程序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
Run Code Online (Sandbox Code Playgroud)

但我认为您可以编写自己的上传处理程序,它不采用基本名称并按您想要的方式运行。以下是如何编写自定义上传处理程序的一些信息。

然后你需要在FILE_UPLOAD_HANDLERS设置中定义你的处理程序。

使用 Django 3.1编辑自定义上传处理程序

  • 我不明白如何实现它,您可以用一个工作示例来扩展您的答案吗? (2认同)