Dmi*_*rin 7 javascript html5 blob google-chrome-extension
我有BlobBuilder(Chrome11)的问题我尝试从服务器获取XHR请求的图像.然后我尝试使用BlobBuilder/FileWriter将其保存到本地FS.互联网上的每个例子都是关于使用text/plain mime类型,这些例子工作得很好.但是当我尝试编写使用XHR获得的二进制数据时,文件大小变为原始文件大小的1.5-2倍.它无法在Picasa/Eye of Gnome中查看.
var xhr = new XMLHttpRequest();
var photoOrigUrl = 'http://www.google.ru/images/nav_logo72.png';
xhr.open('GET', photoOrigUrl, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var contentType = xhr.getResponseHeader('Content-type');
fsLink.root.getFile('nav_logo72.png', {'create': true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
var BlobBuilderObj = new (window.BlobBuilder || window.WebKitBlobBuilder)();
BlobBuilderObj.append(xhr.responseText);
fileWriter.write(BlobBuilderObj.getBlob(contentType));
}, function(resultError) {
console.log('writing file to file system failed ( code ' + resultError.code + ')');
});
});
}
}
xhr.send();
Run Code Online (Sandbox Code Playgroud)
fsLink存在,这是扩展.
Sto*_*ive 15
问题是将BlobBuilder.append(xhr.responseText)其参数检测为UTF-8字符串,这是XHR返回的,而不是二进制数据,这就是它的真实含义.有一些技巧可以让BlobBuilder将其读取为二进制数据而不是字符串数据:
var xhr = new XMLHttpRequest();
var photoOrigUrl = 'http://www.google.ru/images/nav_logo72.png';
xhr.open('GET', photoOrigUrl, true);
// CHANGE 1: This stops the browser from parsing the data as UTF-8:
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var contentType = xhr.getResponseHeader('Content-type');
fsLink.root.getFile('nav_logo72.png', {'create': true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
// CHANGE 2: convert string object into a binary object
var byteArray = new Uint8Array(xhr.response.length);
for (var i = 0; i < xhr.response.length; i++) {
byteArray[i] = xhr.response.charCodeAt(i) & 0xff;
}
var BlobBuilderObj = new (window.BlobBuilder || window.WebKitBlobBuilder)();
// CHANGE 3: Pass the BlobBuilder an ArrayBuffer instead of a string
BlobBuilderObj.append(byteArray.buffer);
// CHANGE 4: not sure if it's needed, but keep only the necessary
// part of the Internet Media Type string
fileWriter.write(BlobBuilderObj.getBlob(contentType.split(";")[0]));
}, function(resultError) {
console.log('writing file to file system failed ( code ' + resultError.code + ')');
});
});
}
}
xhr.send();
Run Code Online (Sandbox Code Playgroud)
这给了我一个文件,其长度与xhr.getResponseHeader('Content-Length')它应该有的相同.
| 归档时间: |
|
| 查看次数: |
7045 次 |
| 最近记录: |