博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
How to get blob data using javascript XmlHttpRequest by sync
阅读量:6524 次
发布时间:2019-06-24

本文共 2627 字,大约阅读时间需要 8 分钟。

Tested:

Firefox 33+ OK

Chrome 38+ OK

IE 6 -- IE 10 Failed

 

Thanks to 阮一峰's blog: http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html

 

 

The sample shows how to get blob data using javascript XmlHttpRequest by sync.

 

The w3c tell us cannot set responseType when async is false.

FROM: http://www.w3.org/TR/2012/WD-XMLHttpRequest-20121206/

If async is false, the JavaScript global environment is a document environment, and either the anonymous flag is set, the timeout attribute value is not zero, the withCredentials attribute value is true, or the responseType attribute value is not the empty string, throw an "InvalidAccessError" exception and terminate these steps.

 

The result is that the type of XMLHttpRequest.response always string, you must change string to blob.

if you not set "charset=x-user-defined", the string is ascii by default. The XMLHttpRequest.response is not correct, some bytes are changed.
I set to utf-8 or utf-16 also for test, but failed.
when using utf-8, the length of XMLHttpRequest.response is not correct
when using utf-16, the length equals to Real-Length/2. the problem is when Real-Length is odd I cannot get the last byte.

 

 

<!DOCTYPE HTML>

<html>
<head>
</head>
<body>
<div id="aabb"></div>
<script>

var URL = URL || window;

function saveAs(blob, filename) {
var type = blob.type;
var force_saveable_type = 'application/octet-stream';
if (type && type != force_saveable_type) {
var slice = blob.slice || blob.webkitSlice || blob.mozSlice;
blob = slice.call(blob, 0, blob.size, force_saveable_type);
}
var url = URL.createObjectURL(blob);
console.log(url);
var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
save_link.href = url;
save_link.download = filename;
save_link.text = 'ffff';
/*
// in firefox 33+
var m = document.getElementById('aabb');
m.innerHTML = '<a href="' +url+ '">FFF</a>';
*/

// in chrome 38+

var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event);
URL.revokeObjectURL(url);

}

function binaryToBlob(data) {
var l = data.length, arr = new Uint8Array(l);
for(var i = 0; i < l; i++) {
arr[i] = data.charCodeAt(i);
}
return new Blob([arr], { type: 'image/octet-stream'})
};

(function(){

var r = new XMLHttpRequest();
r.open("GET", 'a.tif', false);
r.overrideMimeType('text/plain; charset=x-user-defined'); // this line is very important ,the charset must be x-user-defined
r.send();
var blob = binaryToBlob(r.response);
blob.fileType = "image/octet-stream";
saveAs(blob, 'res.tif');

})();

</script></body></html>

转载地址:http://mdjbo.baihongyu.com/

你可能感兴趣的文章
[转]分享2011年8个最新的jQuery Mobile在线教程
查看>>
云平台 测试
查看>>
64位Win8企业版终于使用Hyper-V功能了!
查看>>
android call require api level
查看>>
redis简介
查看>>
Mac下android环境搭建
查看>>
Visual Studio及TFS进行单元测试、负载测试、代码覆盖率、每日构建配置
查看>>
创建Visual Studio项目模版向导的几篇参考文章
查看>>
深入浅出SQL Server Replication第一篇:走近Replication(上)
查看>>
Windows 8,VS 2012,SQL Server 2012,Office 2013使用体验
查看>>
c++中dll的种类用法分析
查看>>
[TopCoder][SRM] SRM 562 DIV 2
查看>>
PyQt4安装方法 - - ITeye技术网站
查看>>
SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第一篇)
查看>>
获取线程结束代码(Exit Code)
查看>>
QT 跨平台的C++应用和UI开发库
查看>>
简明 Vim 练级攻略 | 酷壳 - CoolShell.cn
查看>>
LocalAlloc,VirtualAlloc,malloc,new的异同
查看>>
关于 IE firefox Chrome下的通过用js 关闭窗口的一些问题
查看>>
回调函数
查看>>