File size: 2,122 Bytes
4f989ff
6924c65
9aaf9d7
 
8d3bc9c
6924c65
 
 
 
 
 
 
 
 
 
 
9aaf9d7
 
 
 
6924c65
8d3bc9c
 
 
 
 
 
9aaf9d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6924c65
9aaf9d7
 
 
 
 
 
 
6924c65
 
8d3bc9c
 
6924c65
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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。')