Как сохранить текст в формате .txt по ссылке для скачивания? - PullRequest
1 голос
/ 29 мая 2020

HTML newb ie здесь

Я работаю над приложением, использующим Streamlit . На основе ввода данных пользователем в доступные поля я генерирую некоторые данные, которые хочу загрузить в виде файла .txt.

Данные, которые я хочу загрузить, генерируются, когда я загружаю

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

и когда я делаю print(to_save), я получаю (это всего лишь небольшая часть очень огромных текстовых данных)

b "UNA: +.? 'UNB + UNO C: 3 + 9978715000006: 14 + 9978715000006: 14 + 200529: 1139 + 50582307060_WP? + _ 200101_200201 ++ TL'UNH + 1 + MSCONS: D: 04B: UN: 2.3'BGM + 7 + 50582307060_WP_200 + _ 20010 1 + 9'DTM + 137: 202005291139: 203'RFF + Z13: 13008'NAD + MS + 9978715000006 :: 9'CTA + IC +: Майкл Джордан'COM + м. jordan@energycortex.com: EM'NAD + MR + 9978715000006: : 9 '"

Теперь я хочу сохранить эту информацию в виде файла .txt по ссылке HTML. Я следую:

  1. Как загрузить файл в Streamlit
  2. Как принудительно полностью загрузить текстовый файл по ссылке?

и у меня

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)

Но это не работает и отображается следующим образом:

Начало

enter image description here

Конец

enter image description here

и когда я это сделаю:

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)

Я получаю

enter image description here

Проблема в том, что информация, которая должна быть сохранена в виде файла .txt (to_save = abc.serialize().encode("ascii", "ignore")) не сохраняется, и я получаю Failed-Network error

Какую ошибку я делаю и как я могу включить сохранение информации, хранящейся в to_save (to_save = abc.serialize().encode("ascii", "ignore")) как HTML ссылка для скачивания? Кроме того, файл следует сохранить как 'reference.txt', указав ссылку как указанную выше переменную.

1 Ответ

2 голосов
/ 02 июня 2020

Думаю, я нашел решение вашей проблемы. Хотя я не могу быть полностью уверен, это вызвано двумя причинами. Первый находится в атрибуте 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 не совсем синее цвет (здесь, в контейнере кода stackoverflow выше). Это из-за того, что строка " прерывается, она закрывает ранее открытый " после 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)

Надеюсь, это поможет! Если нет, прокомментируйте.

...