Django如何上传文件夹

4

我知道如何通过django上传多个文件,但是当上传一个包含子文件夹的文件夹时,我遇到了问题。django无法接收子文件夹。我找到了原因,因为浏览器使用“.”来表示文件夹,而django不能解析它,然后停止解析。有没有一种优雅的方法来解决这个问题呢?

python代码:

def uploader_single(request):
    data = {}
    if request.method == 'POST':
        if True:
            for afile in request.FILES.getlist('file'):
                new_file = UploadFileSingle(file = afile)
                new_file.save()

            return HttpResponseRedirect('')
        else:
            print "form is not valid"
            return HttpResponseRedirect('')
    else:
        print 'not post'

Python代码:

class UploadFileSingle(models.Model):
    file        = models.FileField(upload_to='files/%Y/%m/%d', models.FilePath)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    models.FilePathField.recursive = True
    models.FilePathField.allow_folders = True
    updated_at  = models.DateTimeField(auto_now=True)

    def some_folder = FilePathField(path='some_path', recursive=True, allow_files=True, allow_folders=True,)'

HTML代码:

<input type="file" name="file" multiple = "true" webkitdirectory="true" directory = "true"/>
3个回答

2

有一个新的主题问了同样的问题,我尝试回答:

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

基本上这是Django的默认行为,如果你想要不同的行为,你需要编写自己的上传处理程序。


0

我想出了解决这个问题的简单方法。

  • 您可以通过前端的HTML和JavaScript获取文件夹名称
  • 将其作为值传递给隐藏表单字段
  • 在后端,您可以使用该名称创建一个目录
  • 并将文件上传到此目录中。

HTML

<input type="hidden" name="dir_name" id="id_dir_name">
<input type="file" name="file" onchange="selectFolder(event)" webkitdirectory="" multiple="" required="" directory="" id="id_file">

JS

function selectFolder(e) {
    var theFiles = e.target.files;
    var relativePath = theFiles[0].webkitRelativePath;
    var folder = relativePath.split("/");
    $("#" + id).val(folder[0]);
}

视图

directory_name = form.cleaned_data['dir_name']
os.mkdir(os.path.join(settings.MEDIA_ROOT, directory_name))
handle_uploaded_file(request.FILES['file'], directory_name)

更推荐编写自己的上传处理程序。 - Stack

-5

非常感谢。但是您能否请解释一下我如何在我的情况下准确应用过滤器?谢谢。 - Tengerye
Django的过滤器无法做到这一点。我的结论是Django目前还不能做到。 - Tengerye
2
与问题无关。 - Gagik Sukiasyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接