如何通过可下载的链接将文本保存为 .txt 文件?

Posted

技术标签:

【中文标题】如何通过可下载的链接将文本保存为 .txt 文件?【英文标题】:How to save a text as .txt file via a downloadable link? 【发布时间】:2020-09-16 20:41:26 【问题描述】:

HTML 新手在这里

我正在使用Streamlit 开发一个应用程序。根据用户对可用字段的输入,我正在生成一些我想以.txt 文件的形式下载的数据。

我要下载的数据是在我下载的时候生成的

to_save = abc.serialize().encode("ascii", "ignore")

当我执行print(to_save) 时,我得到(这只是非常庞大的文本数据的一小部分)

b"UNA:+.? 'UNB+UNOC:3+9978715000006:14+9978715000006:14+200529:1139+50582307060_WP?+_200101_200201++TL'UNH+1+MSCONS:D:04B:UN:2.3'BGM+7+5058230101_20_WP? 1+9'DTM+137:202005291139:203'RFF+Z13:13008'NAD+MS+9978715000006::9'CTA+IC+:迈克尔 Jordan'COM+m.jordan@energycortex.com:EM'NAD+MR+9978715000006::9'"

现在,我想通过 html 链接将此信息保存为 .txt 文件。我正在关注:

    How to download a file in Streamlit How to force fully download txt file on link?

我有

reference = 50582307060_WP+_200101_200201
to_save = abc.serialize().encode("ascii", "ignore")
href = f'<a href="data:text/plain;charset=UTF-8,to_save" download=reference.txt>Download File</a> (right-click and save as reference.txt)'
st.markdown(href, unsafe_allow_html=True)

但这不起作用,显示如下:

开始

结局

当我这样做时:

to_save = abc.serialize().encode("ascii", "ignore")
href = f'<a href="data:text/plain;charset=UTF-8" download=reference.txt>Download File</a> (right-click and save as reference.txt)'
st.markdown(href, unsafe_allow_html=True)

我明白了

问题在于必须保存为 .txt 文件 (to_save = abc.serialize().encode("ascii", "ignore")) 的信息没有被保存,我得到了 Failed-Network error

我犯了什么错误,如何将to_save (to_save = abc.serialize().encode("ascii", "ignore")) 中存储的信息保存为 HTML 可下载链接?此外,该文件应保存为“reference.txt”,并在上面将引用定义为变量。

【问题讨论】:

仅用于调试目的:当您省略 download= 属性和 &lt;a&gt; 标记中的值时,它是否有效? 【参考方案1】:

我想我已经找到了解决您问题的方法。虽然我不能完全确定,但它有两个原因。第一个位于下载链接的href 属性中。这里的问题是to_save 变量数据中的"(双引号)。 html,对于我可以用你提供的数据进行测试,呈现如下:

<a href="data:text/plain;charset=UTF-8,b"UNA:+.? 'UNB+UNOC:3+9978715000006:14+9978715000006:14+200529:1139+50582307060_WP?+_200101_200201++TL'UNH+1+MSCONS:D:04B:UN:2.3'BGM+7+50582307060_WP?+_200101_200201-1+9'DTM+137:202005291139:203'RFF+Z13:13008'NAD+MS+9978715000006::9'CTA+IC+:Michael Jordan'COM+m.jordan@energycortex.com:EM'NAD+MR+9978715000006::9'"" download=filename.txt>Download File</a>

如您所见,href 属性的值并非全部为蓝色(此处位于上面的 *** 代码容器中)。那是因为"打断了字符串,它关闭了href="之后早先打开的"。为了防止这种行为,您应该将to_save 中的" 替换为&amp;quot;。对用户来说,这看起来与" 相同,但浏览器会将其视为普通字符串。

您应该将以下代码行添加到您的 python 脚本中以实现这一点

to_save = abc.serialize().encode("ascii", "ignore")
#add this line:
to_save = to_save.replace('"','&quot;')

接下来,download 属性的值周围没有任何双引号。它应该正式地看起来像这样:download="filename.txt". Then again, for safety replace any possible"with"`。

完整的 python 代码现在应该如下所示:

reference = 50582307060_WP+_200101_200201
reference = reference.replace('"','&quot;')

to_save = abc.serialize().encode("ascii", "ignore")
to_save = to_save.replace('"','&quot;')

href = f'<a href="data:text/plain;charset=UTF-8,to_save" download="reference.txt">Download File</a> (right-click and save as reference.txt)'
st.markdown(href, unsafe_allow_html=True)

希望这会有所帮助!如果没有,请评论。

【讨论】:

嘿@Chiel,感谢您的帮助。明天上班时我会检查它并更新你的信息。

以上是关于如何通过可下载的链接将文本保存为 .txt 文件?的主要内容,如果未能解决你的问题,请参考以下文章

从 JavaScript 创建一个可下载的附件?

如何在 django 中提供可下载的 zip 文件

在 Heroku 中构建可下载的站点地图 zip 文件

使用 R 进行网页抓取:看不到可下载的链接

如何将TXT文件保存为HTML

ExtJS 4.2 将网格数据导出到可下载的 CSV 文件