如何在Django中获取上传文件的名称

时间:2017-12-02 07:55:16

标签: python django

我已经看到了一些关于它的问题,但这些问题无法解决我的问题,这就是为什么我要问一个新问题。所以,不要将此标记为重复,请!

使用Python(3.6)& Django的(1.10) 我试图获取上传文件的名称,但它返回

  

属性错误:' NoneType'对象没有属性' name'

这是我尝试过的: 来自 models.py

sourceFile = models.FileField(upload_to='archives/', name='sourceFile', blank=True)

来自 HTML模板

<div class="form-group" hidden id="zipCode">
                    <label class="control-label" style="font-size: 1.5rem; color: black;">Select File</label>
                    <input id="sourceFile" name="sourceFile" type="file" class="file" multiple
                           data-allowed-file-extensions='["zip"]'>
                    <small id="fileHelp" class="form-text control-label" style="color:black; font-size: .9rem;">
                        Upload a Tar or Zip
                        archive which include Dockerfile, otherwise your deployment will fail.
                    </small>
                </div>

来自 views.py

if form.is_valid():
               func_obj = form
               func_obj.sourceFile = form.cleaned_data['sourceFile']
               func_obj.save()
               print(func_obj.sourceFile.name)

这里有什么问题?

请帮帮我!

提前致谢!

1 个答案:

答案 0 :(得分:1)

要获取文件名,只需使用request.FILES字典(我假设只上传了1个文件)

示例:

try:
    print(next(iter(request.FILES))) # this will print the name of the file
except StopIteration:
    print("No file was uploaded!")

请注意,这要求通过POST方法将文件作为表单的一部分发送。

要将其名称更改为随机字符串,我建议使用uuid.uuid4,因为这会生成一个随机字符串,该字符串很可能不会与已存在的任何内容发生冲突。此外,您需要通过提供生成名称的功能来修改upload_to=模型的sourceFile部分:

# In models.py

def content_file_name(instance, filename):
    filename = "{}.zip".format(str(uuid.uuid4().hex))
    return os.path.join('archives', filename)

# later....

sourceFile = models.FileField(upload_to=content_file_name, name='sourceFile', blank=True)

希望这有帮助!