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

How to save a text as .txt file via a downloadable link?

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+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'"

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

  1. How to download a file in Streamlit
  2. 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 可下载 link?此外,文件应另存为 'reference.txt',引用被定义为上面的变量。

我想我已经找到了解决您问题的方法。虽然我不能完全确定,但它有两个原因。第一个在于下载link的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 属性的值并不都是蓝色的(在上面的 Whosebug 代码容器中)。那是因为中断字符串的",它关闭了href="之后更早打开的"。为了防止这种行为,您应该将 to_save 中的 " 替换为 &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)

希望对您有所帮助!如果没有,请评论。