我正在研究Blob,我注意到当你有一个ArrayBuffer时,你可以很容易地将它转换成Blob,如下所示:
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
我现在的问题是,有没有可能从一团变成一团?
或者您可以使用fetchapi
fetch(URL.createObjectURL(myBlob)).then(res => res.arrayBuffer())
我不知道性能差异是什么,这也会显示在DevTools中的“网络”选项卡上。
Response
API使用一个(不可变的)Blob
,可以通过多种方式从中检索数据。OP只要求使用ArrayBuffer
,下面是它的演示。
var blob = GetABlobSomehow();
// NOTE: you will need to wrap this up in a async block first.
/* Use the await keyword to wait for the Promise to resolve */
await new Response(blob).arrayBuffer(); //=> <ArrayBuffer>
或者你可以使用这个:
new Response(blob).arrayBuffer()
.then(/* <function> */);
注意:此API与旧(旧)浏览器不兼容,因此请查看浏览器兼容性表以确保安全;)
您可以使用FileReader
将Blob
作为ArrayBuffer
读取。
这里有一个简短的例子:
var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function(event) {
arrayBuffer = event.target.result;
};
fileReader.readAsArrayBuffer(blob);
下面是一个较长的示例:
// ArrayBuffer -> Blob
var uint8Array = new Uint8Array([1, 2, 3]);
var arrayBuffer = uint8Array.buffer;
var blob = new Blob([arrayBuffer]);
// Blob -> ArrayBuffer
var uint8ArrayNew = null;
var arrayBufferNew = null;
var fileReader = new FileReader();
fileReader.onload = function(event) {
arrayBufferNew = event.target.result;
uint8ArrayNew = new Uint8Array(arrayBufferNew);
// warn if read values are not the same as the original values
// arrayEqual from: http://stackoverflow.com/questions/3115982/how-to-check-javascript-array-equals
function arrayEqual(a, b) { return !(a<b || b<a); };
if (arrayBufferNew.byteLength !== arrayBuffer.byteLength) // should be 3
console.warn("ArrayBuffer byteLength does not match");
if (arrayEqual(uint8ArrayNew, uint8Array) !== true) // should be [1,2,3]
console.warn("Uint8Array does not match");
};
fileReader.readAsArrayBuffer(blob);
fileReader.result; // also accessible this way once the blob has been read
这在Chrome 27-69、Firefox 20-60和Safari 6-11的控制台上进行了测试。
这里还有一个现场演示,您可以使用:https://jsfiddle.net/potatosalad/FbaM6/
更新2018-06-23:感谢Klaus Klein提供关于活动的提示。目标结果
与此对比。结果
参考:
我有一个功能应用程序,当blob被上传或更新时触发。但在我的要求中,我的容器可能一次接收数千个blob(客户将批量将blob上传到容器)。在这种情况下,正如我所知,函数app将为容器中的每个blob并行运行。但我需要在队列中处理它们。因此,我想在这里使用队列存储。每当上传blob时,让我通过blob触发功能应用程序将该blob名称作为队列消息添加到队列存储中,然后我将拥有一个队列触发功能应用,它将
BlobStore API(可以为GCS对象生成BlobKey,BlobStore文件API是不推荐的,但一次使用有效) Google Cloud Storage API(再次被否决,但一次使用有效) 谷歌云存储客户端库 谷歌云存储Python库 谷歌云存储JSON API库 博图 有什么理由用一个来代替另一个吗?
> 我正在向我的某个 Azure Api 管理 API 发送 POST 请求 在此帖子请求中,有一个 json 正文,其中包含 base64 编码的数据(zip 文件),如以下示例所示: {“foo”:“bar”,“data”:“your-base64-string”} 在API策略中,我想向Azure Storage REST API发送一个单独的请求,将上面提到的base64字符串保存为一个z
我需要拍摄一个div的屏幕截图,并需要将其发送到服务器(Java)进行存储。我公司项目中的现有代码使用Html2Canvas。js获取元素的位置(div,body…)返回base64数据URI,它工作正常,但在Chrome中冻结了应用程序。因此,我正在寻找其他解决方案,并从堆栈溢出中找到以下代码。 在这里,我得到的网址是Blob-Url(blob:https://fiddle.jshell.net
问题内容: 我制作了一个Java函数,将a 作为输入。我有一个实例要传递给该函数。如何将其转换为? 我是否需要使用BLOB参数重新编写函数? 问题答案: 根据“映射数据类型”文档声明类型的Java参数。然后,您调用该对象以获得。
问题内容: 我允许用户通过拖放和其他方法将图像加载到页面中。放置图像时,我用来转换为对象URL以显示图像。我没有撤消该URL,因为我确实重复使用了它。 因此,当需要创建一个对象时,我可以允许他们上传其中包含其中一个图像的表单,是否可以通过某种方式将该对象URL反向转换为a ,然后可以将其附加到a 宾语? 问题答案: 正如gengkev在上面的评论中所暗示的那样,似乎最好/唯一的方法是使用异步xhr