如何通过 django 代码从我的 linux pc 识别文本文件而不检查其扩展名和文件大小? [复制]

Posted

技术标签:

【中文标题】如何通过 django 代码从我的 linux pc 识别文本文件而不检查其扩展名和文件大小? [复制]【英文标题】:How to recognise text file from my linux pc via django code without checking its extension and also its file size? [duplicate] 【发布时间】:2017-05-10 19:54:52 【问题描述】:

大多数情况下,当我们在 linux 中使用 gedit 创建一个新的文本文件时,该文件不会以 .txt 为文本文件的扩展名保存。那么我将如何识别它与 django 代码,因为这里我无法检查文件扩展名这是我的代码...

假设我在以下 models.py 中为每个用户都有一个简历字段

类用户(AbstractUser):

resume= models.FileField( upload_to=get_attachment_file_path,default=None, null=True,validators=[validate_file_extension])

现在我想验证文件是否允许扩展,所以我做了一个 validators.py 如下

def validate_file_extension(fieldfile_obj):

    megabyte_limit = 5.0 
    filesize = sys.getsizeof(fieldfile_obj)
    ext = os.path.splitext(fieldfile_obj.name)[1]  
    print("extensionnnnnnnnnnnnn",ext)
    valid_extensions = ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls','.txt','.odt']

    if not ext.lower() in valid_extensions:
        raise ValidationError(u'Unsupported file extension.')

    elif filesize > megabyte_limit*1024*1024:

        raise ValidationError("Max file size is %s Byte" % str(megabyte_limit))

现在每当我在我的 api 中上传一个文本文件时,它就会说文件类型不受支持,因为代码无法获取 linux 文本文件的扩展名。那么我如何识别那个 不是 的文本文件> 保存为 demo.txt 而我的文本文件仅保存为 demo 但从该文件的属性中可以看出它是文本文件。

我的下一个问题是获取FileField 中上传的每个文件的大小。我使用PostgreSQL 作为Dbms

【问题讨论】:

我想得到那个文件的大小……可以吗? @amrit 你可以先做import os,然后再做os.path.getsize('sample_file.extension'),它会以字节为单位返回大小。 【参考方案1】:

您可能希望检测上传文件的 MIME 类型,而不考虑文件扩展名,这通常通过读取文件头来检测“幻数”或其他指示文件真实性质的位模式来完成。文本文件通常是一种边缘情况,其中没有检测到标题并且前 x 个字节是可打印的 ASCII 或 Unicode。

虽然这有点像兔子洞,但有一些 Python 库可以为您做到这一点。例如:https://github.com/ahupp/python-magic 将通过简单地根据文件内容推断 mime 类型来满足您的需求,然后您将匹配您想要接受的类型。

可以在此处找到一组特定于您需求的相关示例代码:https://***.com/a/28306825/7341881

编辑:Eddie 的解决方案是功能等效的; python-magic 包装了 libmagic,这是 Linux 的本机“文件”命令所利用的。如果您确实决定采用子流程路线,请格外小心,不要通过不正确地清理用户输入(例如用户提供的文件名)来创建安全漏洞。这可能会导致攻击授予对服务器运行时环境的任意访问权限。

【讨论】:

【参考方案2】:

简单的 3 行解决方案,没有外部依赖。

import subprocess

file_info = subprocess.getoutput('file demo')
print(file_info)

在 POSIX 系统(Linux、Unix、Mac、BSD 等)中,您可以使用file 命令,例如file demo 将显示文件信息,即使文件扩展名未明确设置。

demofile 命令的参数,也就是您要检测的实际文件。

免责声明,运行外部命令时要格外小心。

请点击此链接了解有关 Python subprocess 模块的更多信息。 https://docs.python.org/3.6/library/subprocess.html

【讨论】:

以上是关于如何通过 django 代码从我的 linux pc 识别文本文件而不检查其扩展名和文件大小? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的 Windows 笔记本电脑舒适地设计基于 Linux 的终端应用程序?

如何配置 Django 通过 Postfix 发送邮件? [关闭]

Django/AngularJS:如何从我的 AngularJS 脚本访问我的 Python 上下文项

如何使用带有 JSONP 的 django 从我的其他网站加载内容?

如何从我的 Django 模板中调用 Dajax / Dajaxice 函数

如何从我的带注释的 Django 查询中过滤/排除非活动评论?