Javascript &引用;“未定义”;访问文件对象的某些列出的属性时返回

Javascript &引用;“未定义”;访问文件对象的某些列出的属性时返回,javascript,jquery,dropzone.js,fileapi,Javascript,Jquery,Dropzone.js,Fileapi,我似乎无法访问对象的宽度或高度键 我使用的是dropzone.js,它有一个addedFile事件,返回文件和第一个参数 因此: 回调工作正常,在我的控制台中我看到: 正如您所看到的,显然有可用的高度和宽度键 myDropzone.on('addedFile', function(file) { console.log(file.name); // returns the whole strong console.log(file.width); // returns unde

我似乎无法访问对象的宽度或高度键

我使用的是dropzone.js,它有一个addedFile事件,返回文件和第一个参数

因此:

回调工作正常,在我的控制台中我看到:

正如您所看到的,显然有可用的高度和宽度键

myDropzone.on('addedFile', function(file) {
    console.log(file.name); // returns the whole strong
    console.log(file.width); // returns undefined
    console.log(file['width']);  // returns undefined
});
这里是一个截图:


我的问题是,为什么名字是可用的,而不是宽度或高度?是因为它们是只读的还是别的什么?如果是这样的话,是否有可能访问它?

从您编写的代码中看不出任何错误,可能文件的类型不是object而是string,您可以尝试JSON.parse(file)方法,然后获取width键。

file.width属性是DropzoneJS扩展,不是核心的一部分;它是后来添加的

Dropzone将数据添加到事件触发时可以使用的文件对象中。如果是图像,则可以访问
file.width
file.height

如果适用,图像大小信息在
“缩略图”
事件发生时可用。不能保证在此事件之前设置

文档对此不是很清楚,只是暗指“生成缩略图时”,但这就是(请参阅createThumbnail/resize函数)-生成缩略图时收集图像大小


看到最初的行为是因为
console.log
(在浏览器中,例如Chrome,其处理方式类似于
console.dir
)显示“live”对象。这反过来又为异步缩略图生成和关联的图像标注收集提供了足够的时间,以便在浏览器在控制台中显示对象的当前关联属性之前完成。(这也解释了为什么使用超时读取属性值是有效的,尽管这不是一种可靠的方法。)


另一方面,直接访问
file.width
会强制立即计算still not set属性,这会导致
“addedFile”
回调中
未定义的

添加脏超时不会每次都起作用,在发送大文件或多个文件时会出现一些不确定的情况

我也有同样的头痛,在上传和在服务器端检查之前,personnaly放弃了检查宽度和高度。事实上,您可以通过返回标题错误来显示dropzone错误:

$size = getimagesize(current($_FILES['value']['tmp_name']));

if($size[0] == 840 && $size[1] == 570){
    //perfect
}
else{
    header("HTTP/1.0 406 Not Acceptable");
    echo 'Your image must be 840x570px';
    exit();
}

所以我想说清楚。正如user2864740所说,您需要等待“缩略图”事件。这将导致以下代码:

myDropzone.on('addedFile', function(file) {
  myDropzone.on("thumbnail", function(file){            
     console.log(file);   
     console.log(file.width); // returns width
     console.log(file['width']);  // returns width
  });
});
您甚至可以在accept方法中使用它,如下所示:

myDropzone.on('accept', function(file, done){
   myDropzone.on("thumbnail", function(file){
     if(file.width != 728 && file.height != 90){
       done("Resolution is not correct (Super Banner (728x90))");
     } else {
       done();
     }
   });
}

我在complete函数中使用了timeout 50ms,未定义的函数消失了

啊,就这样,,100毫秒就足以访问它:)尽管有时它不会被定义,但有可能吗?这肯定是个问题。你认为创建一个有限制的递归回调是获取此数据的更好解决方案吗?@ShannonHochkins否。获取信息的唯一正确方法是等待
缩略图
事件被激活解雇。如果成功,这将在
addedFile
事件后的某个时间点调用。请注意,当支持多个上载时,它似乎会为每个文件/缩略图组合触发。添加uuid检查可解决以下问题:
if(file.upload.uuid==thumbnail.upload.uuid){/*在此处执行任务*/}
myDropzone.on('accept', function(file, done){
   myDropzone.on("thumbnail", function(file){
     if(file.width != 728 && file.height != 90){
       done("Resolution is not correct (Super Banner (728x90))");
     } else {
       done();
     }
   });
}