通过一些研究我发现,虽然ArrayBufferView最初没有公开(通过[NoInterfaceObject]),但由于我描述的用例,似乎应该有广泛的一致意见.
最初的协议是ArrayBufferView在DOMWindow命名空间上公开构造函数,该命名空间在Safari(并且仍然在6.1.1中)和Chrome中实现,但随后从Chrome中提取,转而使用静态方法ArrayBuffer.isView().
与此同时,Mozilla(仍在)谈论实施 ArrayBuffer.isView().
Safari公开了ArrayBufferView构造函数
Chrome有 ArrayBuffer.isView()
Firefox什么都没有
IE - 我还没有接近......
所以,我的问题.检查对象是否是ArrayBufferView实例的最简洁方法是什么?
我试图使用FileReader readAsArrayBuffer属性读取本地文件.读取成功,在"onload"回调中,我在reader.result中看到了Array Buffer对象.但是Array Buffer只是空的.设置长度,但不设置数据.我如何获得这些数据?
这是我的代码
<!DOCTYPE html>
<html>
<body>
<input type="file" id="file" />
</body>
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
var selFile = files[0];
var reader = new FileReader();
reader.onload = function(e) {
console.log(e.target.result);
};
reader.onerror = function(e) {
console.log(e);
};
reader.readAsArrayBuffer(selFile);
}
document.getElementById('file').addEventListener('change', handleFileSelect, false);
</script>
</html>
Run Code Online (Sandbox Code Playgroud)
reader.result的控制台输出
e.target.result
ArrayBuffer {}
e.target.result.byteLength
25312
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何获取这些数据?有一些安全问题吗?没有错误,不执行onerror.
来自评论:你能告诉我如何访问缓冲区内容吗?我实际上正在尝试播放音频文件AudioContext...为此我需要缓冲数据...
我只是想知道为什么每个人都使用ArrayBuffer而不仅仅是正常的array,string或者用字符串化JSON来从服务器向客户端发送消息.它效率更高吗?
另外,只是想知道Uint8Array它是什么,它是如何不同,在哪里使用两个等.
我目前正在使用带有Socket.io的Node.js,但WebSocket如果它是一种更好的方法,我很乐意改为纯s.
我有一个使用的拖放脚本readAsArrayBuffer().缓冲区的长度是完美的,但我似乎无法弄清楚如何从缓冲区中提取数据.
显然我必须制作一个DataView或Uint8Array或其他东西,然后迭代它的byteLength...帮助!
编辑 相关代码(不是很多):
var reader = new FileReader();
reader.onload = function(e) {
// do something with e.target.result, which is an ArrayBuffer
}
reader.readAsArrayBuffer(someFileHandle);
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用CryptoJS解密ArrayBuffer对象,但到目前为止它总是返回一个空白的WordArray.文件(图像)在iOS和Android应用程序中加密,发送到服务器,并在此Web应用程序中下载以进行解密和显示.iOS和Android应用程序能够毫无问题地解密文件,因此加密过程没有任何问题.
XMLHttpRequest使用responseType设置为的方式下载文件arraybuffer.到目前为止,这是我的代码:
// Decrypt a Base64 encrypted string (this works perfectly)
String.prototype.aesDecrypt = function(key) {
var nkey = CryptoJS.enc.Hex.parse(key.sha256());
return CryptoJS.AES.decrypt(this.toString(), nkey, {
iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000'),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
// Decrypt a plain encrypted ArrayBuffer (this is the problem, it always outputs an empty WordArray)
ArrayBuffer.prototype.aesDecrypt = function(key) {
// Get key
if (!key) return null;
var nkey = CryptoJS.enc.Hex.parse(key.sha256());
// Get input (if I pass the ArrayBuffer directly to the create function, …Run Code Online (Sandbox Code Playgroud) 我在尝试着 :
我成功收到文件的二进制文件,即成功回调被调用,但是当我尝试执行getEntries时,我得到并出错.我认为错误是发送流的方式,请帮忙.
错误消息:
读取zip文件时出错
我的客户端代码(使用角度):
$http.get(window.location.origin + '/book/'+bookName,{responseType:"Blob"}).
success(function (data , error) {
var a = new Uint8Array(data);
//var dataView = new DataView(data);
//var blob = new Blob(dataView.buffer);
zip.useWebWorkers = true;
zip.workerScriptsPath = '/js/app/';
zip.createReader(new zip.BlobReader(data), function(reader) {
// get all entries from the zip
reader.getEntries(function(entries) { //HERE I GET THE ERROR
if (entries.length) {
// get first entry content as text
entries[0].getData(new zip.TextWriter(), function(text) {
// text contains the entry data …Run Code Online (Sandbox Code Playgroud) 这是我的代码行.
var xhr = new XMLHttpRequest();
xhr.open('GET',window.location.href, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(event) {
debugger;
console.log(" coverting array buffer to string ");
alert(String.fromCharCode.apply(null, new Uint8Array(this.response)));
};
xhr.send();
Run Code Online (Sandbox Code Playgroud)
该请求正在制作一个大约3 MB的pdf网址.阅读几个相同错误的线程,告诉必须有一些递归调用,但我没有看到任何递归调用.有帮助吗?
这个问题与提供的其他答案不同,因为我的问题集中在VUE上,并且VUE是否也有防止默认方法的方法。
这个问题更特定于HTML 5“下载”以及:href的VUE绑定,以及为什么它不能阻止默认浏览器在新选项卡中打开文件的行为。
预期的行为:将文件下载到浏览器
实际行为:在新选项卡中打开文件
例外:在新选项卡中仅打开图像,pdf和浏览器兼容的文件,其他文件(如.exe)正常下载-为什么这样做,可以在html中更改此行为吗?
添加target =“ _ blank”不能解决问题
<a :href="downloadById(item.url)" download>Download</a>
Run Code Online (Sandbox Code Playgroud)
单击上面的链接后,将在新的浏览器选项卡中打开文件,我需要防止这种默认行为,并在单击后强制下载。HTML 5标记“下载”被认为可以解决此问题,但似乎不起作用。
Chrome最近不推荐使用跨域下载的下载标签表单。vue是否有修饰符来防止此默认设置?还有其他方法可以使用javascript或html下载文件吗?
一个建议的解决方案是将URL读取为arrayBuffer,然后在DOM中创建一个新的blob,然后创建一个anchor元素,然后单击它。。但这似乎很难强制下载文件。
我确信他们一定是一个更干净的解决方案,可以从URL下载文件,这是一个小问题,希望有一个简单的解决方案。
谢谢。
我目前正在研究用二进制数据读取部分XHR响应的可能性.我们当前的方法基于'responseText'属性和base64编码.显然,这远非最佳.
我们如何使用XHR读取部分Blob/ArrayBuffer响应?当我在Chrome中尝试时,整个ArrayBuffer/Blob在readyState = 4时可用,但在此之前不可用.
总而言之,在我看来:
我在这里错过了什么吗?我们可以采取什么方法来阅读部分二元响应?
我正在开发一个 API,它以arraybuffer类型的形式获取文件数据。我的主要问题是知道文件的 mime 类型是什么,因为arraybuffer我需要将其转换为BLOB查看文件。
var file1 = new Blob([response], { type: file.type });
var fileURL = URL.createObjectURL(file1);
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,response是 an arraybuffer,我得到的 mime 类型是在上传时将其存储在变量中。但现在的情况是我手里没有任何哑剧类型,所以我需要一种方法来获取它。
有人能给我建议吗?
arraybuffer ×10
javascript ×9
node.js ×2
angular ×1
audiocontext ×1
binary ×1
blob ×1
cryptojs ×1
download ×1
encoding ×1
encryption ×1
file-upload ×1
html5 ×1
instanceof ×1
jquery ×1
socket.io ×1
stream ×1
typedarray ×1
vue.js ×1
websocket ×1
zip.js ×1