Spaces:
Sleeping
Sleeping
import streamlit as st | |
import requests | |
from tqdm import tqdm | |
import os | |
from urllib.parse import urlparse | |
# 设置Streamlit应用程序的标题 | |
st.title('文件下载器') | |
# 创建一个文本输入框,让用户输入文件的URL | |
url = st.text_input('输入文件的URL:') | |
# 如果用户输入了URL并且点击了下载按钮 | |
if st.button('下载'): | |
if url: | |
try: | |
# 发送HEAD请求获取文件大小 | |
response = requests.head(url, allow_redirects=True) | |
file_size = int(response.headers.get('content-length', 0)) | |
# 从URL中提取文件名 | |
parsed_url = urlparse(url) | |
filename = os.path.basename(parsed_url.path) | |
if not filename: | |
filename = 'downloaded_file' | |
if len(filename) > 255: | |
filename = filename[:255] | |
# 下载文件并显示进度条 | |
response = requests.get(url, stream=True) | |
response.raise_for_status() # 如果发生HTTP错误,将引发异常 | |
progress_bar = st.progress(0) | |
downloaded_size = 0 | |
chunk_size = 1024 # 每次读取1KB | |
with open(filename, 'wb') as file: | |
for data in tqdm(response.iter_content(chunk_size=chunk_size), | |
total=file_size // chunk_size, unit='KB'): | |
file.write(data) | |
downloaded_size += len(data) | |
progress_bar.progress(downloaded_size / file_size) | |
st.success(f"文件已下载完成:{filename}") | |
with open(filename, "rb") as file: | |
st.download_button(label='下载文件', | |
data=file, | |
file_name=filename, | |
mime='application/octet-stream') | |
except requests.exceptions.RequestException as e: | |
st.error(f"下载文件时出错:{e}") | |
except Exception as e: | |
st.error(f"发生错误:{e}") | |
else: | |
st.warning('请输入一个有效的URL。') | |