[英]Html5's File API - BLOB usages?
我有一个文件输入: ( jsbin )
<input type="file" accept="image/*" id="input" multiple onchange='handleFiles(this)' />
Which, when file selected, shows small images of the selected image:
我可以通过两种方式做到这一点:
使用文件阅读器:
function handleFiles(t) //t=this
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.style... = ...
document.getElementById('body').appendChild(img);
var reader = new FileReader();
reader.onload = (function (aImg)
{
return function (e)
{
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
}
// ...
}
使用 ObjectURL / BLOB :
function handleFiles(t)
{
var fileList = t.files;
for (var i = 0; i < fileList.length; i++)
{
var file = fileList[i];
var img = document.createElement("img");
img.src = window.URL.createObjectURL(file);
img.onload = function (e)
{
window.URL.revokeObjectURL(this.src);
}
document.getElementById('body').appendChild(img);
}
}
如您所见,两者都有效:
但是
html 结果不同:
问题:
对于第一个,我已经知道我可以做什么,它是纯粹的data-uri
数据。
但是我什么时候应该使用第二种方法(blob)? 我的意思是 - 我能做什么blob:http%3A//run.jsbin.com/82b29cc5-8452-4ae2-80ca-a949898f4295
?
ps mdn关于URL.createObjectURL
解释并不能帮助我了解何时应该使用每个。
blob:
URL 的长度始终低于合理限制。
数据 URL 可以是任意大的。 因此,当数据 URL 太长时,某些浏览器(IE、 cough )将不再显示图像。 因此,如果您想显示非常大的文件,使用blob:
或filesystem:
URL)可能比数据 URL 更有意义。
此外,您可以使用XMLHttpRequest
直接从blob:
URL 恢复数据(假设 blob 尚未被撤销,例如因为文档已卸载,并且未违反同源策略) 。 例如,以下代码以文本形式获取 Blob URL 的内容:
var blobUrl = URL.createObjectURL(new Blob(['Test'], {type: 'text/plain'}));
var x = new XMLHttpRequest();
// set x.responseType = 'blob' if you want to get a Blob object:
// x.responseType = 'blob';
x.onload = function() {
alert(x.responseText);
};
x.open('get', blobUrl);
x.send();
如果您想使用XMLHttpRequest
将 File 的内容提交到服务器,则使用blob:
或data:
URL 没有任何意义。 只需使用FormData
对象直接提交File
对象。 如果您丢失了原始File
引用,并且您只有一个blob:
URL,那么您可以使用前面的代码段再次获取Blob
对象以在FormData
使用。
给定一个data:
-URL,恢复原始数据远非易事。 Firefox 和 Opera 12- 允许使用data:
-URL in XMLHttpRequest
。 Chrome、Internet Explorer、Safari 和 Opera 15+ 拒绝通过 XMLHttpRequest 加载数据 URL。 因此,在恢复数据方面, blob:
URL 也优于data:
-URL。
如果要在同一来源的不同帧中显示文件的结果,请务必使用blob:
URL。 如果您想在不同的框架(可能在不同的来源)中操作包含在Blob
中的数据,请不要使用 blob 或数据 URLs ,直接使用postMessage
发送数据。
blob:
-URL 通常比data:
更好data:
-用于表示(二进制)数据的 URL。 对于小数据(最大 20kb), data:
URLs 可能是更好的选择,因为支持的浏览器范围更广:比较Can I use Blob URLs和Can I use Data URIs (尽管如果你正在编写一个复杂的 HTML5 应用程序,赔率是你不会支持 IE9-) 。
以下是您如何使用这两种类型的 URL 的主要区别:
FileReader
访问数据,并且不能直接从 URL 中提取数据,如 Data URLs这个列表使数据 URL 看起来是一个明显的优势,但 BLOB url 创建速度更快,并且,除非您需要将 url 发送给其他用户或服务器,否则您应该使用它们,因为它们更快、更易于使用,更易于管理,更适合 IE。 但是,如果您确实需要将 url 发送到服务器或其他用户,我会建议以某种方式直接使用 XHR2 传输 blob。 数据网址不是很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.