HTML 客户端可移植文件生成 - 无需外部资源或服务器调用

2024-01-11

我有以下情况:

我在公司内部服务器上设置了一系列 Cron 作业来运行各种旨在检查数据完整性的 PHP 脚本。每个 PHP 脚本都会查询公司数据库,将返回的查询数据格式化为包含一个或多个<tables>,然后将 HTML 文件作为附件邮寄到多个客户电子邮件。根据我的经验,大多数 PHP 脚本生成仅包含几个表的 HTML 文件,但是也有一些 PHP 脚本创建包含大约 30 个表的 HTML 文件。 HTML 文件被选为这些扫描的分发格式,因为 HTML 可以轻松地在浏览器窗口中同时查看多个表。

我想添加让客户端将 HTML 文件中的表格下载为 CSV 文件的功能。我预计客户在怀疑基于表数据的数据完整性问题时会使用此功能。对于他们来说,如果能够获取相关表格,将数据导出到 CSV 文件,然后进一步研究,那将是理想的选择。

因为是否需要将数据导出为 CSV 格式由客户自行决定,无法预测哪些表将受到审查,并且会间歇性地使用,因此我不想为每个表创建 CSV 文件。

通常创建 CSV 文件不会太困难,使用 JavaScript/jQuery 进行 DOM 遍历,并利用服务器调用或 flash 库将 CSV 文件数据生成为字符串,以方便下载过程;但我有一个限制:HTML 文件必须是“可移植的”。

我希望客户能够获取他们的 HTML 文件并对公司内网之外的数据进行分析。此外,这些 HTML 文件很可能会被存档,因此出于前面两个原因,使导出功能“自包含”在 HTML 文件中是非常理想的功能。

从 HTML 文件生成 CSV 文件的“可移植”约束意味着:

  1. 我无法拨打服务器电话。这意味着ALL文件生成必须在客户端完成。

  2. 我希望电子邮件附加的单个 HTML 文件包含生成 CSV 文件的所有资源。这意味着我无法使用 jQuery 或 flash 库来生成该文件。

据我所知,出于明显的安全原因,任何浏览器都不支持使用 JavaScript 将文件写入磁盘。我不想在用户不知情的情况下创建文件;我想在内存中使用 JavaScript 生成文件,然后提示用户从内存中“下载”文件。

我已经考虑过将 CSV 文件生成为 URI,但是根据我的研究和测试,这种方法存在一些问题:

  • IE 不支持文件的 URI(See Here http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx)

  • FireFox 中的 URI 使用随机文件名将文件保存为 .part 文件

尽管这让我很痛苦,但我可以接受 IE

我的示例表:

<table>
    <thead class="resulttitle">
        <tr>
            <th style="text-align:center;" colspan="3">
            NameOfTheTable</th>
        </tr>
    </thead>
    <tbody>
        <tr class="resultheader">
            <td>VEN_PK</td>
            <td>VEN_CompanyName</td>
            <td>VEN_Order</td>
        </tr>
        <tr>
            <td class='resultfield'>1</td>
            <td class='resultfield'>Brander Ranch</td>
            <td class='resultfield'>Beef</td>
        </tr>
        <tr>
            <td class='resultfield'>2</td>
            <td class='resultfield'>Super Tree Produce</td>
            <td class='resultfield'>Apples</td>
        </tr>
        <tr>
            <td class='resultfield'>3</td>
            <td class='resultfield'>John's Distilery</td>
            <td class='resultfield'>Beer</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
          <td colspan="3" style="text-align:right;">
          <button onclick="doSomething(this);">Export to CSV File</button></td>
        </tr>
    </tfoot>
</table>

我的 JavaScript 示例:

<script type="text/javascript">
  function doSomething(inButton) {

    /* locate elements */
    var table = inButton.parentNode.parentNode.parentNode.parentNode;
    var name  = table.rows[0].cells[0].textContent;
    var tbody = table.tBodies[0];

    /* create CSV String through DOM traversal */
    var rows  = tbody.rows;
    var csvStr = "";
    for (var i=0; i < rows.length; i++) {
      for (var j=0; j < rows[i].cells.length; j++) {
        csvStr += rows[i].cells[j].textContent +",";
      }
      csvStr += "\n";
    }

    /* temporary proof DOM traversal was successful */
    alert("Table Name:\t" + name + "\nCSV String:\n" + csvStr);

    /* Create URI Here!
     * (code I am missing)
     */

    /* Approach #1 : Auto-Download From Browser
     * Attempts to redirect the browser to the URI
     * and have the browser download the data as a file
     *
     * Approach does downloads CSV data but:
     * In FireFox downloads as randomCharacers.part instead of name.csv
     * In Chrome downloads without prompting the user and without correct file name
     * In Safari opens the files in browser (textfile)
     */
    /* Approach #1 Code:
       var hrefData = "data:text/csv;charset=US-ASCII," + encodeURIComponent(csvStr);
       document.location.href = hrefData;
     */

    /* Approach #2 : Right-Click Save As Link...
     * Attempts to remove "Download Button"
     * and replace the it with an anchor tag <a>
     * that the user can use to download the data
     *
     * Approach sort of works better:
     * When clicking on the link:
     * In FireFox downloads as randomCharacers.part instead of name.csv
     * In Chrome downloads without prompting the user (uses correct name) 
     * In Safari opens the files in browser (textfile)
     * 
     * When right-click "Save As" on the link:
     * In FireFox prompts the user with filename: randomCharacers.part 
     * In Chrome  prompts the user with filename: "download"
     * In Safari  prompts the user with filename: "Unknown"
     */
    /* Approach #2 Code:
       var hrefData = "data:text/csv;charset=US-ASCII," + encodeURIComponent(csvStr);
       var fileLink = document.createElement("a");
       fileLink.href = hrefData;
       fileLink.type  = "text/csv";
       fileLink.innerHTML = "CSV Download Link";
       fileLink.setAttribute("download",name+".csv"); // for Chrome
       parentTD = inButton.parentNode;
       parentTD.appendChild(fileLink);
       parentTD.removeChild(inButton);
     */
  }
</script>

我正在寻找一个示例解决方案,其中可以将上述示例表下载为 CSV 文件:

  • 使用 URI
  • using a <button> or a <a>
  • 代码的工作方式与现代版本的 FireFox、Safari 和 Chrome 中描述的一样
  • AND ( 1. OR 2. ):
      • 系统会提示用户保存文件
      • 用户不需要“右键单击另存为”
      • 自动将文件保存到默认浏览器保存目录
      • 默认文件名是带有 .csv 文件扩展名的表的名称

我添加了一个<script>具有 DOM 遍历功能的标签doSomething()。我真正需要的帮助是将 URI 格式化为我想要的格式doSomething()功能。方法#2(参见我的代码)似乎最有希望。

如果声明有证据,我愿意接受仅使用 HTML 和 JavaScript 不可能实现我想要的功能;例如浏览器文档、DOM 标准、JavaScript/ECMAscript 文档或证明不可能的逻辑反例。

话虽这么说,我认为具有更深入背景/更多 URI 经验的人可以提供解决方案,即使该解决方案有点破解。


只要你不介意在IE上只支持IE10+,就可以使用文件保存器.js https://github.com/eligrey/FileSaver.js。您可以生成 CSV 并将其附加到 Blob,然后saveAs()斑点。您只能在支持的浏览器中保留已保存文件的文件名<a download>,例如 Chrome。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML 客户端可移植文件生成 - 无需外部资源或服务器调用 的相关文章

  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • 在动态创建的元素上添加事件监听器[重复]

    这个问题在这里已经有答案了 是否可以向所有动态生成的元素添加事件侦听器 Javascript 我不是页面的所有者 因此我无法以静态方式添加侦听器 对于页面加载时创建的所有元素 我使用 doc body addEventListener cl
  • 在按钮之间添加空间?

    嗨 我这里有一个代码 除了一件事之外 一切都很完美 代码中每个按钮之间没有空格 我尝试过 margin 但不幸的是它是一个无序列表 所以我有点困惑 我将添加或替换什么以在两个按钮之间留出空间 帮助
  • HTML5 支持命名空间吗?

    我们是否可以使用新标签来扩展 HTML5 例如
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 使 Material UI Grid 项目的子项拉伸以适合父容器的剩余高度

    1 现状 我有一个包含 4 个网格项的 Material UI 网格容器 每个 Grid 项中都有一个 Typography 组件 其中包含标题和包含一些内容的 Card 如下所示 2 期望的外观 我希望卡片填充网格项目的剩余高度并且不超过
  • 窗口大小调整触发的 DOM 事件

    我有一个布局相当复杂的页面 最初打开页面时 某些元素的对齐存在问题 但是 可以通过更改浏览器窗口的大小来 永久 解决此问题 显然 我不希望用户必须调整浏览器窗口的大小才能使页面正确显示 所以我想知道是否有一种方法可以在页面首次加载时以编程方
  • 如何在 javascript 中基于类型字符串创建新对象?

    如何基于变量类型字符串 包含对象名称 在 javascript 中创建新对象 现在我有 随着更多工具的出现 列表会变得更长 function getTool name switch name case SelectTool return n
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • 如何为 TBODY 应用垂直滚动条

    我的表中有 4 列和 5 行数据 我必须为 TBODY 应用垂直滚动条 TH 标题内容不应滚动 我对场景进行了编码 并且在我将滚动类应用于 TBODY 之前它工作正常 一旦我将滚动样式类应用于 TBODY 它就会破坏之前的对齐方式 任何人都
  • JavaScript 中的实时摩尔斯电码转换器

    在看到谷歌关于莫尔斯电码 gmail 的愚人节笑话后 我想我应该尝试用 javascript 创建一个实时莫尔斯电码转换器 我正在使用正则表达式和替换将莫尔斯电码更改为字符 例如 replace g a replace g r 我遇到的问题
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • JavaScript 提升解释

    下面的片段有什么区别 var a 0 function b a 10 return function a b console log a gt 10 and var a 0 function b a 10 return function a
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 使用 AJAX 和 JQuery 按设定的时间间隔刷新 Rails 部分

    I have a page in my rails application that looks like 现在 我有另一个用 python 编码的人工智能应用程序 它处理视频 显示在 Rails 应用程序页面的左侧 并使用捕获的车辆及其相
  • 如何为 Imagus 悬停缩放扩展开发自定义过滤器?

    当我读到关于悬停缩放是邪恶的 http www reddit com r YouShouldKnow comments 1wjrc8 ysk that the hover zoom extension is spyware 哎呀 有两篇文章
  • 检测浏览器选项卡是否具有焦点

    是否有可靠的跨浏览器方法来检测选项卡是否具有焦点 场景是 我们有一个定期轮询股票价格的应用程序 如果页面没有焦点 我们可以停止轮询并为每个人节省流量噪音 特别是当人们喜欢打开具有不同投资组合的多个选项卡时 Is window onblur
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu

随机推荐

  • Python-将图像转换为像素值字符串

    我有一张从网络摄像头捕获的 jpg 图像 它是一个灰度图像 我需要将图像转换为其像素字符串 如下所示 255 232 45 678 56 23 345 76 44 767 433 345 我该怎么做呢 另外 改变图像的大小会改变这些值吗 假
  • 会员模板功能。为什么这个不能编译?

    我想在列表上迭代成员函数 在此代码示例中 我在 for 行中收到编译器错误 预期的 在它之前 它没有声明 结束也没有声明 为什么 该函数甚至没有在代码中使用 template
  • 接口的通用类型约束?

    我可以做这个 void MyMethod
  • 如何从 window.location.pathname 中删除尾部斜杠

    我有以下代码 允许我在网站的桌面版本和移动版本之间切换 我最近意识到所做的只是将每个人都带到该网站的主页 我仔细研究了一下 发现我可以通过将上面的内容修改为 将特定页面重定向到移动版本
  • 通过“Referer”标头防止跨站请求伪造

    我们最近收到了 IBM AppScan DAST 的结果 其中一些结果没有多大意义 2 Medium 跨站请求伪造 风险 可能会窃取或操纵客户会话和 cookie 这可能会被用来冒充合法的 用户 允许黑客查看或更改用户记录 并以该用户身份执
  • 想要在数据表中显示加载程序 GIF

    我正在使用数据表 我的代码工作正常 现在我想添加加载程序图像 gif 我不知道如何添加这个 这是到目前为止我的数据表脚本 document ready function dvloader show oTable example dataTa
  • WPF 仅更改组合框的 PART_EditableTextBox 上的属性

    我想更改默认 wpf 组合框的 PART EditableTextBox 例如更改背景 我尝试添加这样的样式
  • Commander.js 在没有命令的情况下调用时显示帮助

    我在用着指挥官 js https github com tj commander js 编写一个与 API 交互的简单 Node js 程序 所有调用都需要使用子命令 例如 apicommand get 调用方式如下 program ver
  • 无法使用 Appium 在 Android 中单击权限对话框中的“允许”按钮

    我无法使用 Appium Java 在 Android 中点击权限对话框上的 拒绝 或 允许 按钮 在点击这些按钮之前我是否需要添加任何功能 下面是代码 DesiredCapabilities capabilities new Desire
  • 如何使用正则表达式找到 python 字符串中 str.format 的所有占位符? [复制]

    这个问题在这里已经有答案了 我正在创建一个使用用户指定的格式重命名文件的类 该格式将是一个简单的字符串 其str format将调用方法来填充空白 事实证明 我的程序需要提取大括号中包含的变量名称 例如 一个字符串可能包含 user 这应该
  • sbt 构建后 gephi-toolkit 中缺少类

    我正在尝试在 Play 应用程序项目中使用 Gephi toolkit 但在构建项目时遇到了问题 起初 由于一些未解决的依赖关系 我无法构建该项目 作为来自的回答在此输入链接描述 https stackoverflow com questi
  • 短小精悍的 MS Access 更新和插入问题

    我正在使用 Dapper 来更新和插入 Access DB 代码正在运行 不会引发异常 但不会更新数据库中的值 下面是我的代码 sql Append UPDATE drugs repository SET drug name DrugNam
  • 来自波浪线 SVG 的连续波浪动画

    我有一个 SVG 它是用 Adob e Illustrator 构建的波浪线 我正在尝试向其添加连续的波浪状动画 我尝试过 vivus js 并且能够使绘制动画工作 但不能连续工作 我怎样才能开始这样的事情呢 任何答案都可以 无论是纯 CS
  • 我可以使用 -ObjC 以外的链接器标志链接适用于 iOS 的 GoogleMaps SDK

    我正在使用 GoogleMapsSDK 和 Parse 的框架 如果我一起使用它们 由于链接器标志 ObjC Parse 中的错误会触发需要 facebook 键 这是 Parse 论坛和 GoogleMaps 之外的其他框架上有详细记录的
  • 活动菜单项 - asp.net mvc3 母版页

    我一直在四处扫描 试图找到一个合适的解决方案 将 活动 当前 类分配给母版页中的菜单项 关于是否执行此客户端与服务器端 这条线被从中间分开 说实话 我对 JavaScript 和 MVC 都很陌生 所以我没有什么意见 我更愿意以 最干净 和
  • 获取当前页面 url 并更改操作

    我需要给出当前页面 url 并更改操作 url 之后我想在视图文件中回显该内容 我想在视图文件中执行这些操作 而不是控制器 你有什么主意吗 您可以通过以下方式获取当前页面的 url uri Zend Controller Front get
  • jquery.get() - 使用数据作为全局变量的问题

    好吧 我在网上读了很多资料 但仍然没有找到解决我的问题的方法 我需要使用 jquery 方法 get 检查文件的内容是 nok 还是空 我尝试过的事情之一 当然不起作用 但清楚地表明了我的想法 是 document ready functi
  • tabControl 中的关闭按钮

    有没有人可以告诉我如何在 C 中使用 tabControl 在每个选项卡中添加关闭按钮 我计划使用按钮 pic 来替换我的选项卡中的 x 谢谢 无需派生类 这里有一个简洁的片段 http www dotnetthoughts net imp
  • 如何获取 AMP 网站上的查询字符串值?

    有没有办法从 AMP HTML 网站检索查询字符串值并将它们存储在 cookie 中或在链接中使用它们 Example 用户点击广告www example com amp foo bar 打开 AMP 网站 点击链接即可结帐 不是 AMPw
  • HTML 客户端可移植文件生成 - 无需外部资源或服务器调用

    我有以下情况 我在公司内部服务器上设置了一系列 Cron 作业来运行各种旨在检查数据完整性的 PHP 脚本 每个 PHP 脚本都会查询公司数据库 将返回的查询数据格式化为包含一个或多个