Html5 的文件 API - BLOB 用法?

2024-03-17

我有一个文件输入:(jsbin) http://jsbin.com/atICecog/4/edit

 <input type="file"   accept="image/*" id="input" multiple   onchange='handleFiles(this)' />

当选择文件时,会显示所选图像的小图像:

我可以做到two ways :

使用文件读取器:

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);
     }
 }

如您所见,两者都有效:

BUT

html 结果不同:

问题 :

有了第一个,我已经知道我能做什么,它很纯粹data-uri data.

但是我什么时候应该使用第二种方法(blob)? 我的意思是——我能做什么blob:http%3A//run.jsbin.com/82b29cc5-8452-4ae2-80ca-a949898f4295 ?

p.s. mdn https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL#Browser_compatibility关于的解释URL.createObjectURL对我什么时候应该使用它们没有帮助。


的长度blob:URL 始终低于合理限制。

数据 URL 可以任意大。因此,当数据 URL 太长时,某些浏览器(IE、cough)将不再显示图像。所以,如果你想显示非常大的文件,使用blob: (or filesystem:URL)可能比数据 URL 更有意义。


Also, you can directly recover data from a blob: URL (provided that the blob has not been revoked yet, e.g. because the document was unloaded, and the same origin policy is not violated) using XMLHttpRequest. For example, the following code gets the content of a blob URL as text:

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,使用 a 确实没有意义blob: or data: URL。只需提交File直接使用对象FormData https://developer.mozilla.org/en-US/docs/Web/API/FormData目的。如果你丢失了原件File参考,而你只有一个blob:URL,然后您可以使用前面的代码片段来获取Blob再次使用对象FormData.

Given a data:-URL,恢复原始数据远非易事。 Firefox 和 Opera 12 - 允许使用data:-URL in XMLHttpRequest。 Chrome、Internet Explorer、Safari 和 Opera 15+ 拒绝通过 XMLHttpRequest 加载数据 URL。所以,关于恢复数据,blob:URL 也优于data:-URLs.

如果你想在同一个源的不同帧中显示文件的结果,一定要使用blob:网址。如果您想操作包含在Blob在不同的框架中(可能在不同的原点),不要使用 blob 或数据 URL,直接使用发送数据postMessage https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage.

blob:-URLs are generally better than data:-URLs for representing (binary) data. For small data (max 20kb), data: URLs might be a better choice because of the higher range of supported browsers: Compare Can I use Blob URLs http://caniuse.com/bloburls with Can I use Data URIs http://caniuse.com/datauri (though if you're writing a complex HTML5 application, odds are that you're not going to support IE9-).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Html5 的文件 API - BLOB 用法? 的相关文章

随机推荐

  • 如何检测 Android 应用程序何时最小化?

    如何检测 Android 应用程序何时进入后台 onPause 或 onUserLeaveHint 有效 但在方向更改或呈现另一个活动时也会被调用 标记的答案是OP问题的解决方法 对于我们其他正在寻找答案的人来说 您可以使用以下方法来实现这
  • 如何使用 tablayout 在 vi​​ewpager 中设置当前选项卡

    我有一个使用选项卡布局的自定义视图页面 由于某些原因禁用了滑动 内容根据选择的选项卡而变化 我想用浓缩咖啡测试一下 1 单击特定选项卡 2 查看选项卡特定页面的部分数据 我怎样才能做到这一点 我是浓缩咖啡新手 有几种方法可以做到这一点 一种
  • @PreAuthorize 如何检查角色? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有几个 REST API 我想将安全性置于所有这些之上 以便仅允许某些角色使用这些功能 我将 EnableGlobalMethodSecu
  • torch数据集的结构是怎样的?

    我开始使用 torch 7 我想制作我的数据集进行分类 我已经制作了像素图像和相应的标签 但是 我不知道如何将这些数据提供给火炬 我阅读了其他人的一些代码 发现他们使用的是扩展名为 t7 的数据集 我认为它是张量类型 这样对吗 我想知道如何
  • 错误代码:1222。使用的 SELECT 语句具有不同的列数

    我尝试了一些语句 包括连接 但无法将其他三个 MySQL 表中的数据插入到一个表中 在我的最后一次尝试中 我收到此错误 错误代码 1222 使用的 SELECT 语句具有不同的列数 请参阅下面我输入的查询 我是编码新手 所以我对 MySQL
  • 在服务器中下载 YouTube 视频

    我创建了一个 YouTube 搜索引擎 下载 MP3 转换脚本 我用过Jeckman 的 YouTube 下载器 https github com jeckman YouTube Downloader blob master getvide
  • Pandas 如何过滤一个系列

    在执行 groupby name 并在其他列上使用 Mean 函数后 我有一个这样的系列 name 383 3 000000 663 1 000000 726 1 000000 737 9 000000 833 8 166667 谁能告诉我
  • 具有不同形状的 Tensorflow 数据集

    我使用卷积网络对不同形状的图像进行分类 我找不到在 Tensorflow 中加载图像的方法 基于这个问题 https github com tensorflow tensorflow issues 2354它应该与 tf data Data
  • 根据对象类型将视图注入 ItemsControl

    我有一项服务返回 Party 类型的数组 政党有两个子类型 个人和组织 我在 WPF 应用程序 Prism MVVM 中从视图模型使用此服务 在此视图模型的构造函数中 我填充了 Party 类型的可观察集合 public PhoneBook
  • python 多线程连接超时

    看起来 如果你有一个n个线程的循环 并将它们与超时t逐一连接 那么你实际花费的时间是n t 因为开始计算一个子线程的超时时间是最后一个子线程的结束时间 有什么办法可以将总时间减少到 t 而不是 n t 吗 是的 您可以计算绝对超时 并在每次
  • 跟踪集合的旧部分和新部分

    我正在使用backbone js 并且我有一个包含 dos 的集合fetch 有时 我不想通过该选项 add true 由于我的子视图的创建方式 集合被循环 每个项目都是附加到当前表的新行 我尝试的一件事就是清空整个表并创建所有新行 但这太
  • 为 Web 表单添加自定义基类

    我想为我的所有 Web 表单添加自定义基类 我在我的 asp net web 项目中创建了一个 App code 文件夹 并添加了一个简单的基页面类 如下所示 namespace MySite Web base page for all t
  • 打包Python项目时设置zip_safe为True有什么好处?

    setuptools 文档仅说明 为了获得最佳性能 Python 包最好安装为 zip 文件 然而 并非所有包都能够以压缩形式运行 因为它们可能期望能够像正常操作系统文件一样访问源代码或数据文件 因此 setuptools 可以将您的项目安
  • 无法以编程方式在外部存储上创建文件夹 - Android

    这是我的代码 boolean success false Log d TAG Environment getExternalStorageDirectory Environment DIRECTORY PICTURES myFolder m
  • 在浏览器中使用 NodeJS Crypto 模块和 webpack

    我正在编写一个 javascript REPL 旨在在浏览器中运行并执行 nodejs 加密函数 我的项目是在 ReactJS 中 我使用 webpack 将所有模块和依赖项捆绑在一起 我试图将内置节点加密模块包含在 webpack 生成的
  • TypeScript 到 JSDoc:全局/接口

    我目前正在使用 JSDoc 将项目从 TypeScript 转换为 JavaScript 我正在尝试使用 JSDoc 执行以下操作 declare global namespace jest interface Matchers
  • ld:找不到 -lz.1.2.3 的库

    当尝试编译适用于 iOS 5 的软件时 XCode 4 2 抛出错误 ld library not found for lz 1 2 3 我发现这篇文章告诉我替换 1 2 3 与 1 2 5 https github com dbloete
  • Flexslider - 图像预加载器

    我的响应式 flexslider 插件有问题 除非实际幻灯片中有很多图像 否则该插件可以正常工作 那么加载行为是不可接受的 我希望有人可以帮助我使用以下 flexslider 图像预加载器脚本 因为我无法让它工作 这是我正在使用的代码 柔性
  • 在 R Shiny 标头中制作图像超链接

    我一直在尝试将图像输出超链接到网站 但我在仔细阅读有关堆栈溢出的其他问题时遇到了麻烦 带有闪亮的可点击链接的 svg 不可点击 https stackoverflow com questions 37121767 svg with clic
  • Html5 的文件 API - BLOB 用法?

    我有一个文件输入 jsbin http jsbin com atICecog 4 edit