当URI太长时,Chrome会崩溃

时间:2012-01-05 19:14:34

标签: javascript html5

我正在为我的HTML5游戏制作导出功能,我目前的保存方法是游戏数据的原始序列化,然后:

// this is Javascript
var gameData = "abc"; // this is actually a HUGE string of over 2MB
try
{
    document.location = "data:text/octet-stream,"+encodeURIComponent(JSON.stringify(gameData));
}
catch(e)
{
    console.log(e);
}

来自:Using HTML5/Javascript to generate and save a file

我不介意我不能将它用于大字符串,但我希望它能够生成警告,通知此方法不起作用,不幸的是Chrome(16)崩溃而没有抓住它异常。

有没有更好的方法来实现这种导出,对我来说重要的是让它在本地工作。 FileAPI将是一个更好的解决方案,但不能在本地工作。

2 个答案:

答案 0 :(得分:1)

AFAIK不可能是客户端;但是这样可以在Chrome中保存1.99MB文件;也许你应该尝试压缩/优化你的游戏数据。一种方法是使用JSZip

为了检查当前浏览器是否为Google Chrome,因此该方法不适用于长字符串,您可以使用以下内容:

if(gameData.length > 1999999 && window.chrome){
    alert("Sorry, this export method does not work in Google Chrome")
    return; 
}

答案 1 :(得分:0)

我假设json.stringify正在运行 但是由于URI很大,win.location失败了。

你可以做的是将你的uri转换为blob,然后

URL.createObjectURL(file)

这将创建一个指向内部对象的URL(浏览器内部)。

它将按预期工作。

这是一种将dataURI转换为blob的方法

function(dataURI) {
  // convert base64 to raw binary data held in a string
  // doesn't handle URLEncoded DataURIs
  var byteString;
  if (dataURI.split(',')[0].indexOf('base64') >= 0)
      byteString = atob(dataURI.split(',')[1]);
  else
      byteString = unescape(dataURI.split(',')[1]);
  // separate out the mime component
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

  // write the bytes of the string to an ArrayBuffer
  var ab = new ArrayBuffer(byteString.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < byteString.length; i++) {
      ia[i] = byteString.charCodeAt(i);
  }

  // write the ArrayBuffer to a blob, and you're done
  return new Blob([ab],{type: mimeString});
}

}