javascript – HTML客户端可移植文件生成 – 无需外部资源或服务器调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – HTML客户端可移植文件生成 – 无需外部资源或服务器调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5505字,纯文字阅读大概需要8分钟。
内容图文
![javascript – HTML客户端可移植文件生成 – 无需外部资源或服务器调用](/upload/InfoBanner/zyjiaocheng/784/8ab3cab3b2564fa68442e70874429ce0.jpg)
我有以下情况:
我在内部公司服务器上设置了一系列Cron作业,以运行旨在检查数据完整性的各种PHP脚本.每个PHP脚本查询公司数据库,将返回的查询数据格式化为包含一个或多个< tables>的HTML文件,然后将HTML文件作为附件邮寄到多个客户端电子邮件中.根据我的经验,大多数PHP脚本生成只有几个表的HTML文件,但是有一些PHP脚本创建HTML文件,大约有30个表.已选择HTML文件作为这些扫描的分发格式,因为HTML可以在浏览器窗口中一次查看多个表.
我想为客户端添加功能,以便将HTML文件中的表格下载为CSV文件.我预计客户在怀疑基于表数据的数据完整性问题时会使用此功能.对于他们来说,能够获取有问题的表格,将数据导出到CSV文件,然后进一步研究它将是理想的选择.
因为需要将数据导出为CSV格式由客户自行决定,不可预测哪些表将受到审查,并且间歇性地使用我不想为每个表创建CSV文件.
通常创建CSV文件并不会太困难,使用JavaScript / jQuery预先形成DOM遍历并使用服务器调用或flash库将CSV文件数据生成为字符串以方便下载过程;但我有一个限制条件:HTML文件需要“可移植”.
我希望客户能够获取他们的HTML文件并对公司内部网外部的数据进行预先形成分析.此外,这些HTML文件很可能会被归档,因此,出于前两个原因,在HTML文件中“自包含”导出功能是非常理想的功能.
从HTML文件生成CSV文件的“可移植”约束意味着:
>我无法拨打服务器电话.这意味着所有文件生成必须在客户端完成.
>我希望附加到电子邮件的单个HTML文件包含生成CSV文件的所有资源.这意味着我无法使用jQuery或flash库来生成文件.
我明白,出于明显的安全原因,任何浏览器都不支持使用JavaScript将文件写入磁盘.我不想在没有用户知识的情况下创建文件;我想在内存中使用JavaScript生成文件,然后提示用户从内存中“下载”该文件.
我已经考虑将CSV文件生成为URI但是,根据我的研究和测试,这种方法存在一些问题:
> IE不支持文件的URI(See Here)
> FireFox中的URI使用随机文件名和.part文件保存文件
尽管我很痛苦,但我可以接受IE< = v9不会为文件创建URI的事实.我想创建一个半跨浏览器解决方案,其中Chrome,Firefox和Safari在JavaScript DOM遍历编译数据后创建URI以下载CSV文件. 我的示例表:
<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
>使用< button>或者< a>
>代码的工作方式与现代版本的FireFox,Safari和&铬
> AND(1.或2.):
>
>提示用户保存文件
>用户无需“右键单击另存为”
>
>自动将文件保存到默认浏览器保存目录
>默认文件名是具有.csv文件扩展名的表的名称
我添加了一个< script>带有DOM遍历函数doSomething()的标记.我需要的真正帮助是在doSomething()函数中将URI格式化为我想要的内容.方法#2(参见我的代码)似乎最有希望.
我愿意接受只使用HTML& amp;如果声明带有证据,则为JavaScript;例如浏览器文档,DOM标准,JavaScript / ECMAscript文档或证明不可能性的逻辑计数器示例.
话虽这么说,我认为可以从具有更深层次背景/更多URI经验的人那里获得解决方案,即使解决方案有点像黑客.
解决方法:
只要你不介意IE浏览器只支持IE10,请使用FileSaver.js.你可以生成CSV并将其附加到Blob,然后保存as()blob.您只能在支持< a download>的浏览器中保留已保存文件的文件名,例如Chrome.
内容总结
以上是互联网集市为您收集整理的javascript – HTML客户端可移植文件生成 – 无需外部资源或服务器调用全部内容,希望文章能够帮你解决javascript – HTML客户端可移植文件生成 – 无需外部资源或服务器调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。