【问题标题】:Javascript Save .txt file with FileSaver with custom filenameJavascript 使用具有自定义文件名的 FileSaver 保存 .txt 文件
【发布时间】:2021-09-08 01:09:27
【问题描述】:

我想在使用此处提供的 FileSaver 工具保存时指定我的 .txt 文件名:

https://github.com/eligrey/FileSaver.js/

据我在网上挖掘,我发现默认情况下没有选项可以将其保存在指定的文件名下,就像这里指出的那样:

Is there any way to specify a suggested filename when using data: URI?

Save file Javascript with file name

Can't specific file name with FileSaver.js

没有可靠的方法来做到这一点。

但是我发现了一些让我完全满意的东西。该页面名为:FileSaver.js demo

https://eligrey.com/demos/FileSaver.js/

其中包括使用指定文件名保存文件的几个选项,以及 .txt 文件。

这意味着,显然存在该选项,因为他们已经使用它进行了管理。

在我检查了他们的网站后,我尝试复制他们使用的 JavaScript 代码。我的一段代码现在看起来像这样:

    <link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/eligrey/FileSaver.js/c3e4a45021f205a790a2699f4af7a5b85fb63e09/demo/demo.css"/>

    <script src="../js/FileSaver.js"></script>

    <script async="" src="https://cdn.rawgit.com/eligrey/Blob.js/0cef2746414269b16834878a8abc52eb9d53e6bd/Blob.js"/>
    <script async="" src="https://cdn.rawgit.com/eligrey/canvas-toBlob.js/f1a01896135ab378aa5c0118eadd81da55e698d8/canvas-toBlob.js"/>
    <script async="" src="https://cdn.rawgit.com/eligrey/FileSaver.js/5ed507ef8aa53d8ecfea96d96bc7214cd2476fd2/FileSaver.min.js"/>
    <script async="" src="https://cdn.rawgit.com/eligrey/FileSaver.js/5ed507ef8aa53d8ecfea96d96bc7214cd2476fd2/demo/demo.min.js"/>

    <textarea class="input" id="text" placeholder="Once upon a time..."/></textarea>
    <form id="text-options">
        <label>Filename: <input type="text" class="filename" id="text-filename" placeholder="a plain document"/>.txt</label>
        <input type="submit" value="Save"/>
     </form>

但不幸的是,它没有按预期工作。

当我点击“保存”按钮时,它只会刷新页面,而不是使用 &lt;textarea&gt; 内容保存相关文件。

有什么办法可以在某个时候修复它吗?

【问题讨论】:

  • 执行它的代码在里面:cdn.rawgit.com/eligrey/FileSaver.js/… - 基本上是针对一堆浏览器的一系列方法。
  • 这个文件我已经附上了,效果是一样的。
  • 那么,您真的只是在说您不知道如何使用表单中的按钮吗?您选择的示例使用触发表单提交的提交按钮(一种特殊类型的按钮)。当您提交表单时,会生成一个事件。他们的代码在使用输入的文本和文件名执行某些操作之前处理该事件并阻止默认行为。您应该使用不同的按钮。即 - 您还必须将事件附加到新按钮。他们在所有示例的文档中附加了一个表单提交处理程序,因为它保存了代码。
  • 这对我来说听起来太复杂了。我打算从他们那里复制代码并尝试在我的示例中实现它。我不明白为什么它不起作用,因为一切都大致相同。
  • 这是因为点击保存按钮提交表单。提交表单将数据发送到指定页面(如果有)或重新加载当前页面。如果您愿意,他们会将提交按钮用作“作弊”的一种方式。它们不是附加到所有的 SAVE 按钮,而是在提交表单时进行处理。我给你举个简单的例子。由您来收集数据并使用 fileSaver.min.js 代码生成下载(您会没事的)。

标签: javascript txt


【解决方案1】:

我在这里找到了一些合理的方法,这使我的代码正常工作。

https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server

代替标准的 FileSaver.js 函数

            function saveURLtoTXTfile() {
            var Urltext = document.getElementById("text").value;

            var blob = new Blob([Urltext], {type: "text/plain;charset=utf-8"});
            saveAs(blob, "survey.txt");

我们可以像这样根据标签值定义我们的文件名:

  <form id="text-options">
        <textarea class="input" id="text" rows="1" cols="30"></textarea>
        <label>Filename: <input type="text" class="filename" id="text-filename" 
  placeholder="a plain document"/>.txt</label>
        <button type="button" class="formreturn" 
  onclick="saveURLtoTXTfile();">Save survey details as a text file</button>
    </form>

   function saveURLtoTXTfile() {
            var Urltext = document.getElementById("text").value;
            var textfilename = document.getElementById("text-filename").value;
            var blob = new Blob([Urltext], {type: "text/plain;charset=utf-8"});
            saveAs(blob, textfilename);
        }

然后我们从文件名中的标签中获取值。

【讨论】:

    【解决方案2】:

    "use strict";
    window.addEventListener('load', onLoaded, false);
    
    function onLoaded(evt)
    {
        // use either one.
        //var saveBtn = document.querySelector('#saveBtn');
        var saveBtn = document.getElementById('saveBtn');
        
        saveBtn.addEventListener('click', onSaveBtnClick, false);
    }
    
    function onSaveBtnClick(evt)
    {
        let textData = document.querySelector('#textInput').value;
        let fileName = document.querySelector('#fileNameInput').value;
        
        alert(`${fileName}.txt - ${textData}`);
    }
    .panel
    {
        display: block;
        width: 320px;
        margin: 16px;
        background-color: #f0e3bb;
    }
        <div class='panel'>
            <h2>Saving text</h2>
            <textarea id='textInput' placeholder="a plain document"></textarea><br>
            <label><input type='text' id='fileNameInput' placeholder='filename'/>.TXT</label><br>
            <button id='saveBtn'>Save</button>
        </div>

    【讨论】:

    • 我收到的是警报而不是文件保存,这很好。我试过: SaveAs(${fileName}.txt - ${textData});但它没有用
    • 我使用了那些宏${someVarHere}一个以反引号开始和结束的文本块(1 左边的键和 esc 下)。在您的情况下,请使用 filename+".txt"textData。现在用 Ctrl-Shift-I 打开调试器不是个好时机
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多