在Python和Javascript中如何检查文件格式是否与文件名扩展名不同?

3

我有一个上传器,它有文件格式验证(只能上传一些视频格式)。

然而用户可以简单地更改原始文件名的扩展名并通过验证(例如将file.pdf重命名为file.mov并上传)!

现在我需要检查和验证文件格式是否与文件扩展名匹配。后端是Python(Django),但我不确定这是否可以通过Payton、Javascript或任何其他解决方案完成。

3个回答

8
在Python中,您可以使用python-magic
引用自Readme: python-magic是与libmagic文件类型识别库交互的Python接口。 libmagic通过根据预定义的文件类型列表检查其标头来识别文件类型。 它分析文件头而不仅仅使用文件扩展名来识别文件类型。
使用方法很简单:
>>> import magic
>>> magic.from_file('renamed.pdf')
'ISO Media, Apple QuickTime movie'
# More handy
>>> magic.from_file('renamed.pdf', mime=True)
'video/quicktime'

3
如果您想通过Javascript来实现此功能,您可以获取所选文件的mime类型并在前端进行检查。这样做的优点是您无需将文件上传到服务器进行初始验证。根据这个网站的说明,.mov文件的mime类型为'video/quicktime'。相比更改文件扩展名,用户很难修改这个信息。
同时请注意Mathias' answer的内容。在后端服务器上对上传的文件进行验证也非常重要:)
这里是使用javascript进行文件验证的演示:file validation using 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;
}

-1

在Mathias的答案基础上,使用python-magic,你可以这样做

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

这不需要保存文件即可获取它的 MIME 类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接