【问题标题】:How can I get the file name from request.FILES?如何从 request.FILES 中获取文件名?
【发布时间】:2011-03-07 21:48:01
【问题描述】:

如何从 Django 中的 request.FILES 获取文件名?

def upload(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            upload = Upload()
            upload.timestamp = datetime.datetime.now()
            save_instance(form, upload)

我试过用这个但是没用:

  if 'filename'  in request.FILES:
         filename = request.FILES['filename']

【问题讨论】:

    标签: django django-forms


    【解决方案1】:
    request.FILES['filename'].name
    

    来自request 文档。

    如果你不知道密钥,你可以遍历文件:

    for filename, file in request.FILES.iteritems():
        name = request.FILES[filename].name
    

    【讨论】:

    • 它给了我:预期的缩进块。我很困惑:(
    • 好的!我如何检查变量名?但我需要打印它如何打印里面的内容?
    • 这对我有用:request.FILES['file'].name
    • request.FILES 是一个类似于对象的多值字典,用于保存通过上传文件按钮上传的文件。在您的 html 中说按钮的名称 (tyep="file") 是“myfile”,所以我的文件将成为这本字典中的键。如果您上传了一个文件,则该键的值将只有一个,如果您上传了多个文件,则该特定键将具有多个值。如果你使用 `request.FILES['myfile'] 你会得到第一个或最后一个值(我不能肯定地说)。如果您只上传一个文件,这很好,如果您想获取所有文件,您应该这样做:
    • iteritems() 在 python3 中被移除,所以你不能再使用这个方法了。 .items() 而不是 .iteritems()
    【解决方案2】:
    file = request.FILES['filename']
    file.name           # Gives name
    file.content_type   # Gives Content type text/html etc
    file.size           # Gives file's size in byte
    file.read()         # Reads file
    

    【讨论】:

    • 如何获取路径?
    • request.FILES['filename'].file.name
    • @AbdulRehman 没有“路径”。文件已上传,现在在内存中。它只有一个名字。
    【解决方案3】:

    如果您使用的是 python 3.x,请注意:

    request.FILES 是一个类似于多值字典的对象,用于保存通过上传文件按钮上传的文件。在您的 html 代码中说按钮的名称 (type="file") 是“myfile”,因此“myfile”将是这本字典中的键。如果您上传了一个文件,那么此键的值将只有一个,如果您上传了多个文件,那么您将拥有该特定键的多个值。如果您使用request.FILES['myfile'],您将获得第一个或最后一个值(我不能肯定地说)。如果您只上传一个文件,这很好,但如果您想获取所有文件,您应该这样做:

    list=[] #myfile is the key of a multi value dictionary, values are the uploaded files
    for f in request.FILES.getlist('myfile'): #myfile is the name of your html file button
        filename = f.name
        list.append(filename)
    

    当然可以将整个东西挤在一行中,但这很容易理解

    【讨论】:

    • 你拯救了我的一天
    【解决方案4】:

    答案可能已经过时,因为在 UploadedFile 类上有一个 name 属性。请参阅:Uploaded Files and Upload Handlers (Django docs)。因此,如果您将表单与FileField 正确绑定,则访问应该很简单:

    if form.is_valid():
        form.cleaned_data['my_file'].name
    

    【讨论】:

      【解决方案5】:

      在 Python 3.8、Django 3.2 上为我工作

      print(request.FILES.items())
      for filename, file in request.FILES.items():
          print(filename, file)
      

      request.FILES.iteritems() 为我扔了AttributeError

      【讨论】:

        猜你喜欢
        • 2020-08-17
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2023-03-24
        • 2017-09-09
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        相关资源
        最近更新 更多