当前位置: 首页 > 面试题库 >

从浏览器下载JSON对象作为文件

吕俊才
2023-03-14
问题内容

我有以下代码,可让用户下载csv文件中的数据字符串。

exportData = 'data:text/csv;charset=utf-8,';
exportData += 'some csv strings';
encodedUri = encodeURI(exportData);
newWindow = window.open(encodedUri);

如果客户端运行代码,它将生成空白页并开始下载csv文件中的数据,效果很好。

所以我试图用JSON对象来做到这一点

exportData = 'data:text/json;charset=utf-8,';
exportData += escape(JSON.stringify(jsonObject));
encodedUri = encodeURI(exportData);
newWindow = window.open(encodedUri);

但是我只看到一个页面,上面显示了JSON数据,没有下载它。

我进行了一些研究,并且该研究声称可以工作,但是我的代码没有任何区别。

我在代码中缺少什么吗?


问题答案:

这是我为应用程序解决的方式:

HTML: <a id="downloadAnchorElem" style="display:none"></a>

JS(纯JS,此处不是jQuery):

var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(storageObj));
var dlAnchorElem = document.getElementById('downloadAnchorElem');
dlAnchorElem.setAttribute("href",     dataStr     );
dlAnchorElem.setAttribute("download", "scene.json");
dlAnchorElem.click();

在这种情况下,storageObj您要存储的是js对象,而“ scene.json”只是结果文件的示例名称。

与其他提议的方法相比,此方法具有以下优点:

  • 无需单击HTML元素
  • 结果将根据您的需要命名
  • 不需要jQuery

我需要这种行为而无需显式单击,因为我想在某个时候从js自动触发下载。

JS解决方案(无需HTML):

  function downloadObjectAsJson(exportObj, exportName){
    var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(exportObj));
    var downloadAnchorNode = document.createElement('a');
    downloadAnchorNode.setAttribute("href",     dataStr);
    downloadAnchorNode.setAttribute("download", exportName + ".json");
    document.body.appendChild(downloadAnchorNode); // required for firefox
    downloadAnchorNode.click();
    downloadAnchorNode.remove();
  }


 类似资料:
  • JavaScript可以获取浏览器提供的很多对象,并进行操作。 window window对象不但充当全局作用域,而且表示浏览器窗口。 window对象有innerWidth和innerHeight属性,可以获取浏览器窗口的内部宽度和高度。内部宽高是指除去菜单栏、工具栏、边框等占位元素后,用于显示网页的净宽高。 兼容性:IE<=8不支持。 'use strict'; ---- // 可以调整浏览器

  • 我知道这个问题已经被问了好几次了,但这些问题的解决方案对我的情况没有帮助。 我想从这个网站下载一个数据集:https://datadashboard.fda.gov/ora/cd/inspections.htm 以下是“数据集”的HTML: 以下是“整个检测数据集”的 HMTL: 下面是我获取数据集的代码: 我也尝试过: 但我得到这个错误: 文件“FDAComplianceDashboardIns

  • 简要背景:我有一个在Azure Blob存储中存储文件的web服务。该服务的用户可以一次下载多个文件。如果下载的所有文件的总文件大小相对较小,那么我在服务器上压缩文件并返回该压缩文件--这里没有问题。 场景:例如,如果一个用户想要下载3个每个1GB的文件,那么我将这些文件下载到服务器是不现实的,将它们压缩,然后将压缩文件返回到浏览器。因此,对于这些场景,我将Azure Blob Storage U

  • 问题内容: 我的代码从远程URL获取文件并在浏览器中下载文件: 代码:http://play.golang.org/p/x-EyR2zFjv 可以获取文件,但是如何在浏览器中下载文件? 问题答案: 要使浏览器打开下载对话框,请在响应中添加和标头: 在将内容发送到客户端之前,请执行此操作。您可能还希望将响应的标头复制到客户端,以显示适当的进度。 要将响应主体流传输到客户端而不将其完全加载到内存中(对

  • 努力将json从URL上的文件(myData.json)加载到对象中,以便访问属性值。 --数据立即加载,我在应用程序中非常需要它。 -我将访问整个应用程序中的数据,而不仅仅是数据加载后立即发生的一个函数的一部分。 --我已确保文件中的数据格式正确。 按照jQuery API上的示例,我不应该做一些简单的事情,比如: 警报(jqxhr.my财产); 得到价值吗?我错过了哪一步?我试过做评估和其他类

  • 问题内容: 一切正常,但是只有当文件很小(大约1MB)时,当我尝试使用更大的文件(例如20MB)时,我的浏览器将其显示,而不是强制下载,到目前为止,我尝试了许多标头,现在我的代码看起来像: 问题答案: 在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。 因此,你的方法应编写如下(由于仅是表示形式,因