无法读取Django FileField?

时间:2019-03-28 13:14:26

标签: python django django-models django-file-upload

我正尝试从 Django Filefield 中读取内容,正如在我的Django模型中可以看到的:

import os
import win32api

from django.db import models
from custom.storage import AzureMediaStorage as AMS

class File(models.Model):
    '''
    File model
    '''
    file = models.FileField(blank=False, storage=AMS(), null=False)
    timestamp = models.DateTimeField(auto_now_add=True)
    remark = models.CharField(max_length=100, default="")

class File_Version(File):
    """
    Model containing file version information
    """
    version = models.CharField(max_length=25, default="")

    @property
    def get_version(self):
        """
        Read all properties of the given file and return them as a dictionary
        """   

        props = {'FileVersion': None}

        # To check if the file exists ?
        ### This returns FALSE
        print("Is the file there? ", os.path.isfile(str(File.file)) )

        # To get file version info
        fixedInfo = win32api.GetFileVersionInfo(str(File.file), '\\')
        print("FixedInfo: ", fixedInfo)

但是 os.path.isfile()始终返回 False 。如何从FileField读取我的自定义模型?

此外,行 fixedInfo 给了我错误:

  

pywintypes.error:(2,'GetFileVersionInfo:GetFileVersionInfoSize',   “系统找不到指定的文件。”

3 个答案:

答案 0 :(得分:0)

os.path.isfile返回文件路径是否指向文件(例如,与目录相对)。 File.file指向models.FileField对象;当前代码将始终返回False。我想您会希望File.file.path获取文件的实际绝对文件路径。

答案 1 :(得分:0)

您可以在模型定义中添加:

class File(models.Model):
    file = models.FileField()
    ...
    ...

    def filename(self):
        return os.path.basename(self.file.name)

或者您可以尝试:

从django.core.files.storage导入default_storage

使用: 1)FieldFile.name:

文件名,包括从相关FileField的存储根开始的相对路径。

2)default_storage.exists(path)

如果给定名称引用的文件已经存在,则返回True。 存储系统;如果名称可用于新文件,则为False。

希望这行得通!

答案 2 :(得分:0)

当您为文件使用其他存储提供程序时,需要使用该存储提供程序的方法来查询文件对象。

os.path.isfilewin32api.GetFileVersionInfo仅适用于本地文件系统。