1

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+:迈克尔乔丹'COM+m.jordan@energycortex.com :EM'NAD+MR+9978715000006::9'"

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

  1. 如何在 Streamlit 中下载文件
  2. 如何强制在链接上完全下载 txt 文件?

我有

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”,其中引用被定义为上面的变量。

4

1 回答 1

2

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

<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属性的值并非全部为蓝色(此处位于上面的 stackoverflow 代码容器中)。那是因为"中断了字符串,它关闭了之前打开的"after href="。为了防止这种行为,您应该将"into_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 possiblewith”`。

完整的 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)

希望这可以帮助!如果没有,请发表评论。

于 2020-06-02T18:17:02.310 回答