如何通过 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
将显示文件信息,即使文件扩展名未明确设置。
demo
是 file
命令的参数,也就是您要检测的实际文件。
免责声明,运行外部命令时要格外小心。
请点击此链接了解有关 Python subprocess
模块的更多信息。
https://docs.python.org/3.6/library/subprocess.html
【讨论】:
以上是关于如何通过 django 代码从我的 linux pc 识别文本文件而不检查其扩展名和文件大小? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何从我的 Windows 笔记本电脑舒适地设计基于 Linux 的终端应用程序?
如何配置 Django 通过 Postfix 发送邮件? [关闭]
Django/AngularJS:如何从我的 AngularJS 脚本访问我的 Python 上下文项
如何使用带有 JSONP 的 django 从我的其他网站加载内容?