Javascript 粘贴大文件

Javascript 粘贴大文件,javascript,html,google-chrome,ubuntu,paste,Javascript,Html,Google Chrome,Ubuntu,Paste,我正在写一个插件来处理文件上传。我认为实现一个粘贴功能会很棒(你有多少次只想粘贴而不需要打开一个照片编辑器,然后将其保存为文件,然后上传,但我离题了)。到目前为止,我所做的工作是有效的,除非粘贴的文件变得太大。我无法告诉你“太大”是什么尺寸,因为我正在选择屏幕截图并将其保存到剪贴板 我当前的代码看起来像 document.getElementById('AJS').onpaste = function (e) { var items = (e.clipboardData || e.ori

我正在写一个插件来处理文件上传。我认为实现一个粘贴功能会很棒(你有多少次只想粘贴而不需要打开一个照片编辑器,然后将其保存为文件,然后上传,但我离题了)。到目前为止,我所做的工作是有效的,除非粘贴的文件变得太大。我无法告诉你“太大”是什么尺寸,因为我正在选择屏幕截图并将其保存到剪贴板

我当前的代码看起来像

document.getElementById('AJS').onpaste = function (e) {
    var items = (e.clipboardData || e.originalEvent.clipboardData).items,
    blob = items[0].getAsFile();
    if (blob && blob.type.match(T.s.accept) && T.currentlength < T.s.maxFiles) {
        T.process(param1, param2, param3, param4, items[0].getAsFile());
    }
};
对于较大的文件,来自
blob=items[0].getAsFile()的blob返回0的大小。还有其他人经历过这个问题吗?你是如何克服的


注意:我正在Ubuntu 14.04上使用最新的Chrome,尽管除了我个人的研究之外,我没有任何参考资料,但似乎在Ubuntu版本的Chrome上有一个bug,阻止用户使用原生JS api进行复制和粘贴。如果你试图使用Ubuntu Chrome在GMail消息中粘贴屏幕截图,你会得到一个错误,但这个错误在任何其他版本的Chrome中都不会出现。我上面的代码也是如此。我在运行chrome的本机windows和OS X环境中测试了它,这些环境指向我的机器,使用这个脚本粘贴效果很好

你的问题是。。。?也不知道具体问题是什么。到底出了什么问题?“它有时不起作用”还不够详细。你为什么要用
FileReader
Blob
变成
Blob
?只需将粘贴的
Blob
转换为对象URL,无需对
FileReader
@raynocholus
T进行所有这些不必要的转换、检查和使用。process
处理有机文件输入数据和粘贴数据(并且有大量与问题无关的代码缺失)。粘贴数据是我最近一个小时左右一直在做的一个新添加。当我说‘我能做些什么使它适用于大文件?’时,我想我已经非常清楚了,‘大文件’的失败之处是什么?出什么事了?你希望我们为你运行和调试你的代码吗?@raynocholus如果我想调试,我会复制一个到codepen或其他任何东西的链接。对于较大的屏幕截图,使用
items[0].getAsFile()创建的blob返回长度为0的blob,因此无法加载任何数据。我只想知道是否有人遇到过这个问题并找到了解决方案。
T.process = function (file, i, changing, target, pasteblob) {
    var fr = new FileReader();
    fr.onload = function (e) {
        var blob = pasteblob || new Blob([e.target.result], {type: file.type});
        var dataURL = (win.URL || win.webkitURL).createObjectURL(blob);
        var index = changing ? i : T.currentlength;
        var filedata =  {};
        if (file.type.match('image/*')) {
            var img = new Image();
            img.onload = function () {
                // Doing stuff
            };
            img.src = dataURL;
        } else {
            // Doing stuff
        }
    };
    fr.readAsArrayBuffer(pasteblob || file);
};