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
@raynocholusT进行所有这些不必要的转换、检查和使用。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);
};