axios 在JavaScript中打开JSON响应,如果响应太大而无法处理,则将其重新路由到文件

xhv8bpkk  于 2023-11-18  发布在  iOS
关注(0)|答案(1)|浏览(156)

我正在寻找一种方法,当在浏览器中显示一个可能很大的响应(超过几兆字节)时,在JS代码中做一些条件逻辑。
为了方便示例,假设我使用Axios库并调用它的.post()方法。请注意,我并不认为具体的库应该在这里重要-我基本上是在寻找一个通用的答案,它应该也适用于纯JS!
假设一个给定的请求可以导致任意大小的JSON响应,如果它碰巧大于某个任意的限制,我如何决定在客户端如何处理它,这样它就不会使浏览器进程崩溃?
换句话说,我只想加载和处理大小不超过5 MB的响应。任何更大的响应都应该通过正常的浏览器机制下载到文件中(包括UI对话框,如果浏览器配置为在下载前询问用户)。
当这一部分完成后,我的JS代码将告诉用户如何处理该文件,以实现所需的结果(通常会自动发生,给出较小的响应)。
我已经知道我可以通过检查响应的Content-Length头来确定它是否违反了我的任意限制,从而以编程方式做出这个决定。问题是,当这种情况发生时,我不知道该怎么办。我如何将这样的响应重定向到一个文件?

lmyy7pcs

lmyy7pcs1#

注解的基本实现,根据文件大小决定在客户端做什么:

async function doThing() {
  const response = await fetch("https://object.cscs.ch/v1/AUTH_7e4157014a3d4c1f8ffe270b57008fd4/ewb-c3300430-fc01-44cd-941d-3be963a065f9?stats&format=json");
  const size = parseInt(response.headers.get("Content-Length"));
  const thing = document.getElementById("thing");
  if (size <= document.getElementById("limit").valueAsNumber) {
    const object = await response.json();
    thing.innerText = JSON.stringify(object, null, 4);
  } else {
    thing.innerText = "Too large, saved instead - doesn't work here on SO";
    const blob = await response.blob();
    const a = document.createElement("a");
    const url = URL.createObjectURL(blob);
    a.href = url;
    a.download = "something.json";
    a.click();
    URL.revokeObjectURL(url);
  }
}

个字符
如果你保持默认限制,文件将显示(它是大约2544字节)。如果你降低限制低于这一点,它将尝试做一个下载(这不会成功,因为沙箱设置,但在https://jsfiddle.net/tevemadar/mq01p5x3/例如)。

相关问题