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 用法? 的相关文章

  • 如何仅在 css/html 中强制在单词之间换行?

    我只有一段普通的文本 p 标签内的 p div 标签 但只有 Firefox 可以正确显示 Firefox 打破了单词之间的界限 所有其他浏览器都会在单词中间断行 这使得阅读变得困难 这是我的意思的一个例子 火狐浏览器 工作中 This w
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • Chromium 嵌入式框架支持 HTML5 音频吗?

    我一直在玩 CefSharp 但似乎无法播放任何音频 我可以让音频控件出现 但它们保持冻结状态 这些是我使用的版本 Chromium 21 0 1180 0 CEF r728 CefSharp 0 12 4596 50 我先尝试了 mp3
  • 如何适应特定子元素的宽度?

    problem 我正在尝试创建一个技能表 我无法问下一个问题为什么 所以我创建了一个新帐户并询问 当前状态 我想将元素的宽度与 meter 也就是说 如何设定区块的标准 meter 子元素 在上面的 gif 中 img meter 我想要保
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 循环遍历元素并逐步为每个元素应用 CSS 规则

    我有一个网格布局 每个网格布局中都有不同数量的元素 我想动态添加内联grid column通过循环遍历 div 中存在的每个元素的 CSS 规则 ul 与一类 list 所以 HTML 代码的输出需要是 ul class list ul u
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • 如何调用 google 的 getBasicProfile() 来仅单击按钮即可登录 google?

    我在我的网站上使用谷歌登录
  • 淘汰赛绑定,每个都可进行自定义

    我这里有一个情况 用于淘汰每个带有定制的绑定 这是我的代码 div div table tbody tr td td td td tr tbody table div div
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • Google 地图 API:忽略 DirectionService 请求中的季节性限制

    我目前正在开发一张地图 其中显示两点之间的最短路线 使用不同的交通工具 我注意到 有时 例如在冬季关闭的道路不会被考虑在内 我发现我可以使用方向服务 下面的代码 忽略高速公路 收费站和渡轮 但我一生都无法弄清楚如何 是否可以忽略季节性限制
  • 如何检测元素内容何时发生变化

    我正在寻找一种方法来监视元素内动态填充 无页面重新加载 内容 以便我可以将类添加到另一个元素 到目前为止我有这个 HTML div class message container div class messages error span
  • 使用日期字符串数组在引导日期选择器中设置禁用月份不起作用

    我有一个日期选择器 其配置如下 HTML div class input group date div
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • 如何让div与包含td的高度相匹配?

    我沿着桌子的一排布置了三个 面板 一个比另外两个高 我希望所有三个面板都与最高的一个的高度相匹配 我尝试将 div 的样式设置为 height 100 但是即使包含的 tds 增长 短面板仍然很短 我的 HTML 是由 JSF 生成的 因此
  • 如何在表格列标题处垂直旋转文本

    我用过这个数据表 http www datatables net 在我的网页上 这是fiddle http jsfiddle net fxju7 2 链接我放置代码的地方 我想要 第一个数字第二个数字列应该垂直旋转 我已经做到了 但是 问题
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm
  • 从输入类型编号获取无效值

    我正在使用输入类型数字 当它无效时 我如何从中获取值 例如 使用类型编号并仅打印 e 这本身是无效的 我正在使用 React 但我认为这个问题非常普遍 onChange event console log event target valu

随机推荐

  • 如何检测 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