Chrome之间传递的Chrome文件对象不再是文件的实例

时间:2015-05-04 21:13:52

标签: google-chrome

回答后更新 - 根据以下答案,我决定在目标页面中复制该文件,以便它成为该窗口的File对象的实例。

function makeFileLocal(file, callBack) {
    var localFile;

    var reader = new FileReader();
    reader.addEventListener("loadend", function () {
        // reader.result contains the contents of blob as a typed array
        var a = new Array(reader.result);
        localFile = new File(a, file.name, { type: file.type, lastModified: file.lastModified });
        callBack(localFile);
    });
    reader.readAsArrayBuffer(file);
}

我将此函数放在目标页面中,并通过window.opener.makeFileLocal(file, callback)从文件创建者调用它。现在我有一个文件传回到与其File对象匹配的目标窗口。

===================原始问题======================

我正在函数中的两个Chrome窗口之间传递一个File对象。在目标窗口中,我需要将对象评估为File的实例,但事实并非如此。

在Chrome控制台中,在传递的浏览器中,object instanceof File的评估结果为true;当对象传递到目标窗口时,object instanceof File的计算结果为false。但是在目标窗口中Object.prototype.toString.call(file) === '[object File]'的计算结果为true。文件对象的所有属性保持不变。

要重新创建问题,请使用以下两页:

<html>
<head>
    <script type="text/javascript">
        function displayFiles(files) {
            window.alert("File 0 is a file? " + (files[0] instanceof File)); // false, should be true
            window.alert("It's an object that's a file though, right? " + (Object.prototype.toString.call(files[0]) === '[object File]')); // true
        }
    </script>
</head>
<body>
    <h1>Page 1</h1>

    <div onclick="window.open('page2.html');">
        Click here to open page two...
    </div>
    <div id="files">
        Files:
    </div>
</body>
</html>

第二页:

<html>
<head>
    <script type="text/javascript">
        function sendFiles() {
            var files = document.getElementById('files').files
            window.alert("File 0 is a file? " + (files[0] instanceof File)); // true
            window.opener.displayFiles(files);
        }
    </script>
</head>
<body>
    <h1>Page 2</h1>

    <div onclick="sendFiles();">
        Click here to send files...
    </div>
    <div>
        <input type="file" id="files" multiple="multiple" />
    </div>
</body>
</html>

必须提供这些页面,如果只是从文件启动,Chrome会抱怨跨窗口脚本。任何想法都会非常感激,如果有什么我可以澄清让我知道。

1 个答案:

答案 0 :(得分:0)

您正在检查错误的File班级。

由于每个窗口都有自己的范围,因此需要

files[0] instanceof opener.File