【问题标题】:Local file download with a lot of content内容丰富的本地文件下载
【发布时间】:2017-10-23 21:18:29
【问题描述】:

我正在使用本地浏览器内数据库来存储数据。但是,我想让用户能够将该数据导出到 CSV。

在谷歌搜索时,我找到了带有数据 url 的解决方案 - 准备带有数据的 url。但是,在我的情况下,每次呈现页面(链接)时要生成 >1MB 的数据。是否有任何替代解决方案可以让我从 JavaScript 生成文件下载,但不需要我预先准备内容 - 仅当用户实际点击链接时?

如果我使用 React 来构建我的应用程序很重要..

【问题讨论】:

  • 将预先准备的解决方案(我假设您已经拥有?)转换为仅在点击/需求时或多或少做相同事情(?)的问题到底出在哪里...... ?
  • 如果我理解正确,您建议在用户单击另一个按钮时使用 data-url 生成锚点?然后触发一点 JS 来实际点击它?
  • 我会先尝试简单地将 Data URI 分配给 location.href,然后看看浏览器是否会让你这样做......
  • 嗯,这实际上是一件非常聪明的事情。我在将 10mb 加载到 DOM 时遇到了问题(不要把 10 看得太严重..),但这种方法可能不会导致将其附加到 DOM..
  • dataURL 限制为几兆。您可以使用my download.js lib 从客户端变量(如字符串和类型化数组)下载大文件。它在可用的情况下使用 window.URL 并回退到 dataURL,从而为您提供最大可能的下载大小,而无需费心了解支持细节。

标签: javascript html reactjs


【解决方案1】:

试试 blob。

(不,不是那种)

demo

var blob = new Blob(["CSV DATA HERE"], {type: "text/csv"});
var url  = URL.createObjectURL(blob);
open(url);

需要将 JSON 转换为 CSV 吗?

demo

(https://stackoverflow.com/a/14966131/6560716)

var data = [["name1", "city1", "some other info"], ["name2", "city2", "more info"]];
var csvContent = "";
data.forEach(function(infoArray, index){
   dataString = infoArray.join(",");
   csvContent += index < data.length ? dataString+ "\n" : dataString;
}); 
var blob = new Blob([csvContent], {type: "text/csv"});
var url  = URL.createObjectURL(blob);
open(url);

需要为文件命名吗?

demo

var blob = new Blob(["CSV DATA HERE"], {type: "text/csv"});
var url  = URL.createObjectURL(blob);
var link = document.createElement("a");
link.setAttribute("href", url);
link.setAttribute("download", "filename.csv");
document.body.appendChild(link);
link.click();

文件名和 JSON?

demo

var data = [["name1", "city1", "some other info"], ["name2", "city2", "more info"]];
var csvContent = "";
data.forEach(function(infoArray, index){
   dataString = infoArray.join(",");
   csvContent += index < data.length ? dataString+ "\n" : dataString;
}); 
var blob = new Blob([csvContent], {type: "text/csv"});
var url  = URL.createObjectURL(blob);
var link = document.createElement("a");
link.setAttribute("href", url);
link.setAttribute("download", "filename.csv");
document.body.appendChild(link);
link.click();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多