检查变量是否持有文件或 Blob

54

Javascript中同时有FileBlob两种文件表示方式,它们几乎是一样的。有没有一种方法可以检查一个变量是否持有FileBlob数据类型?


2
对于鸭子类型,使用 if(x.name) ...;对于严格类型检查,使用 if(x.constructor===File) - dandavis
2
或者比较构造函数的名称 x.constructor.name == 'Blob' - Reflective
6个回答

109

最简单的方法:

a = new File([1,2,3], "file.txt");
b = new Blob([1,2,3]);
c = "something else entirely";

a instanceof File
> true
b instanceof File
> false
c instanceof File
> false

1
文件和 Blob 在我的 Node.js 环境中似乎无法全局使用。你知道我们可以从哪里导入它们吗? - JimmyTheCode

24

W3.org:

“文件对象是带有名称属性的 Blob 对象,该属性为字符串;”

对于 File 类型:

var d = new Date(2013, 12, 5, 16, 23, 45, 600);
var generatedFile = new File(["Rough Draft ...."], "Draft1.txt", {type: 'text/plain', lastModified: d});

console.log(typeof generatedFile.name == 'string'); // true

在 Blob 的情况下:

var blob = new Blob();
console.log(typeof blob.name); // undefined

条件:

var isFile = typeof FileOrBlob.name == 'string';

5
如果可以使用具有名称属性的不同对象,会怎样呢? - Vedmant
如果我们有另一个具有“名称”属性的对象,我们可以对其他属性进行更详细的检查,这只是一个简单的例子。 - Reflective
10
如果一个对象拥有大部分属性,但仍不是File或Blob对象,我认为这是有缺陷的做法。如果对象具有这些属性,它将返回true,但该对象可能仍然不是Blob或File。为什么不直接这样测试isFile instanceof File - Vedmant
@Vendmant 在 typeOf 之外使用 File 构造函数会抛出错误,当 File 不存在时测试实例的文件不起作用。我添加了:typeof File !== 'undefined' && typeof file.name === 'string'这并不是百分之百安全的,但更接近安全。 - augurone

11

让生活更轻松的一行解决方案。

基于Ric Flair

const isFile = input => 'File' in window && input instanceof File;
const isBlob = input => 'Blob' in window && input instanceof Blob;

const a = new File([1,2,3], "foo.txt", {type: "text/plain"});
...

console.log(isFile(a)) // true
...

7

基于Nick Brunt的:

function isFile(input) {
   if ('File' in window && input instanceof File)
      return true;
   else return false;
}

function isBlob(input) {
    if ('Blob' in window && input instanceof Blob)
        return true;
    else return false;
}

//Test
const a = new File([1,2,3], "foo.txt", {type: "text/plain"});
const b = new Blob([1,2,3]);
const c = "something else entirely";

console.log(isFile(a));    //true
console.log(isBlob(a));    //true
console.log(isFile(b));    //false
console.log(isBlob(b));    //true
console.log(isFile(c));    //false
console.log(isBlob(c));    //false

无法在Opera mini以及IE浏览器上使用。尽管对于IE来说这并不重要,因为您可能只会使用文件输入标签,在这种情况下,您肯定知道它是一个文件。


无法翻译,因为这不是一个有效的句子或单词。 - Usman Abdur Rehman

4

比较构造函数类:

var b = new Blob()
console.log(b.constructor === Blob) // true

3

在尝试确定对象是否为文件时,我发现这对我有用:

var reader = new FileReader();

if(file.type){
    reader.readAsDataURL(file);
}

如果我想检查一个特定的文件类型,比如图片,我会这样做:

if(file.type && file.type.indexOf('image') !== -1){
    reader.readAsDataURL(file);
}

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