在Python和Javascript中检查文件格式与文件名扩展是否一致?

3 投票
3 回答
2075 浏览
提问于 2025-04-18 17:16

我有一个文件上传工具,它会检查文件格式(只允许上传某些视频格式)。

但是用户可以简单地修改原文件的名称后缀,从而绕过这个检查(比如把 file.pdf 改成 file.mov 然后上传)!

现在我需要检查和验证文件的格式是否和文件后缀匹配。后台使用的是Python(Django),但我不确定这是否可以通过Python、JavaScript或其他解决方案来实现。

3 个回答

-1

在Mathias的回答基础上,如果你使用python-magic,可以这样做:

file_type = magic.from_buffer(upload.file.read(1024), mime=True)

这样做就不需要先保存文件就能获取它的mime类型。

3

如果你想用JavaScript来实现这个功能,可以获取所选文件的mime类型,并在前端进行检查。这样做的好处是,你不需要先把文件上传到服务器就能进行初步验证。根据这个链接,.mov文件的mime类型是'video/quicktime'。这个类型比单纯改文件扩展名要难修改得多。

另外,记得参考Mathias的回答。在后端服务器上验证上传的文件也是很重要的哦。:)

这里有一个使用JavaScript进行文件验证的示例

$('#movieFile').change(function() {
    var file = $('#movieFile')[0].files[0];

    var filename = file.name;
    var fileMimeType = file.type;
    var fileExtension = filename.split('.').pop();

    if (isValidMimeType(fileMimeType)) {
        console.log('good file');
    } else {
        console.log('bad file');
    }
});

function isValidMimeType(fileMimeType) {
    // mime type of .mov files
    var validFileMimeTypes = [ 'video/quicktime' ];

    for (var i = 0; i < validFileMimeTypes.length; i++) {
        if (validFileMimeTypes[i].toLowerCase() === fileMimeType.toLowerCase()) {
            return true;
        }
    }
    return false;
}
8

在Python中,你可以使用python-magic这个库。

以下是它的说明文档中的一句话:

python-magic是一个Python接口,用于访问libmagic这个文件类型识别库。libmagic通过检查文件的头部信息来识别文件类型,这个过程是根据一个预定义的文件类型列表进行的。

它是通过分析文件的头部信息,而不仅仅是查看文件的扩展名来识别文件类型。

使用起来很简单:

>>> import magic
>>> magic.from_file('renamed.pdf')
'ISO Media, Apple QuickTime movie'
# More handy
>>> magic.from_file('renamed.pdf', mime=True)
'video/quicktime'

撰写回答