我有一个上传器,它有文件格式验证(只能上传一些视频格式)。
但是,用户只需更改原始文件扩展名并通过验证(例如将file.pdf
重命名为file.mov
并上传)!
现在我需要检查并验证文件格式是否与文件扩展名匹配。后端是Python(Django),但我不确定是否可以通过Payton,Javascript或任何其他解决方案来完成。
答案 0 :(得分:8)
在python中,您可以使用python-magic
引用自述文件:
python-magic is a python interface to the libmagic file type identification library. libmagic identifies file types by checking their headers according to a predefined list of file types.
它分析文件头而不是仅使用文件扩展名来识别文件类型。
用法很简单:
>>> import magic
>>> magic.from_file('renamed.pdf')
'ISO Media, Apple QuickTime movie'
# More handy
>>> magic.from_file('renamed.pdf', mime=True)
'video/quicktime'
答案 1 :(得分:3)
如果您想通过Javascript执行此操作,您可以获取所选文件的mime类型并在前端进行检查。这样做的好处是您无需将文件上传到服务器进行初始验证。根据{{3}},.mov文件的mime类型为“ video / quicktime ”。用户修改比修改文件扩展名要困难得多。
另请注意this。在后端服务器中验证上传的文件也很重要。 :)
以下是Mathias' answer的演示。
$('#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;
}
答案 2 :(得分:-1)
使用python-magic添加到Mathias的答案,你可以这样做
file_type = magic.from_buffer(upload.file.read(1024), mime=True)
这不需要保存文件来获取它的mime