如何在没有 FileReader 的情况下从 Blob 和 File 对象创建 ArrayBuffer 和数据 URI
How to create an ArrayBuffer and data URI from Blob and File objects without FileReader?
这个问题与如何在旧浏览器中更新(例如 Safari 5.1.4(相关并受到启发
给定一个具有files
属性的<input type="file">
元素,其中包含从Blob
继承File
对象,是否可以创建一个ArrayBuffer
并将ArrayBuffer
转换为Blob
或File
对象的data URI
而不使用FileReader
?
到目前为止已经尝试过的方法
-
创建一个
.binaryType
设置为"arraybuffer"
的模拟WebSocket
,创建一个event.data
设置为File
对象的MessageEvent
;结果是onmessage
处理程序处File
对象 -
将
File
的原型设置为ArrayBuffer
,Uint8Array
;结果为Uncaught TypeError: Method ArrayBuffer.prototype.byteLength called on incompatible receiver #<ArrayBuffer>()
,Uncaught TypeError: Method get TypedArray.prototype.byteLength called on incompatible receiver [object Object]()
-
在
FormData
对象上设置File
,尝试将请求正文发布到<iframe>
,诚然构思不佳; 结果Bad Request
在 PLNKR
预期结果:将Blob
和File
对象转换为TypedArray
,然后转换为data URL
,或直接转换为data URL
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form method="get" entype="multipart/form-data" target="binaryFrame">
<input id="#avatar" type="file" name="file" />
<input type="submit" />
</form>
<iframe name="binaryFrame"></iframe>
<script>
var input = document.querySelector("input[type=file]");
input.addEventListener("change", handleFiles, true);
// see http://jsfiddle.net/adamboduch/JVfkt/
var sock = new WebSocket("ws://mock");
sock.binaryType = "arraybuffer";
sock.onerror = function(e) {
console.log("sock error", e); // ignore, here
}
sock.onmessage = function(e) {
console.log("socket message", e.data, e.data instanceof ArrayBuffer);
};
function handleFiles(evnet) {
var file = event.target.files[0];
sock.dispatchEvent(new MessageEvent("message", {
data: file
}));
var data = new FormData();
data.append("file", file);
document.forms[0].action = data;
}
</script>
</body>
</html>
<小时 />另请参阅使用 JavaScript 和 websocket 显示来自 blob 的图像,如何在 JavaScript 中将字符串编码为 Base64? ; 有趣的是,我现在问类似的问题 https://stackoverflow.com/questions/34302231/is-there-any-way-to-convert-the-file-to-an-arraybuffer-without-filereader-api; Blob
.slice()
方法、FileReader
.readAsDataURL()
方法
我只是把它放在这里:
var input = document.querySelector("input[type=file]");
input.addEventListener("change", handleFiles, true);
// for url
window.URL = window.URL || window.webkitURL;
function handleFiles(evnet) {
var file = event.target.files[0];
document.querySelector('iframe')
.setAttribute('src', window.URL.createObjectURL(file));
}
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form method="get" entype="multipart/form-data" target="binaryFrame">
<input id="#avatar" type="file" name="file" />
<input type="submit" />
</form>
<iframe name="binaryFrame"></iframe>
</body>
</html>
- 如何从 JavaScript 中的 File-API 对象获取内容
- 传单错误:对象 #<对象> 在 file:///android_asset/www/leaflet.js:6 没有方法“
- 如何在本地存储中保存和还原 File 对象
- 从File对象中的数据播放视频
- 如何在JavaScript中从二进制数据创建File对象
- 如何将javascript FileReader对象附加到html输入[type=“file”]元素
- JS:检查数组中的elem是否为File对象
- 如何在JavaScript中实例化File对象
- 对File对象进行原型设计
- 如何将普通JavaScript对象转换为File对象
- 通过iFrame上传一个javascript File对象
- 如何在JavaScript中添加File对象到FileList集合
- 如何将输入File对象序列化为JSON
- 将当前窗口打印到File/Blob对象
- 在复制的File对象上非法调用
- 如何将json对象放入测试文件("file.json")中,然后在d3.json("fil
- (Javascript)创建一个带有文件路径的File对象
- 如何使用javascript File对象模拟表单提交
- 如何在没有 FileReader 的情况下从 Blob 和 File 对象创建 ArrayBuffer 和数据 URI
- 在JavaScript中重命名File()对象