首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python3开发用于windows、linux和安卓苹果手机平板等设备 局域网文件共享工具

python3开发用于windows、linux和安卓苹果手机平板等设备 局域网文件共享工具

作者头像
王忘杰
发布2026-03-18 12:19:21
发布2026-03-18 12:19:21
1040
举报
文章被收录于专栏:王忘杰的小屋王忘杰的小屋

开发原因 现在的手机和电脑连接,总是要装什么软件或者用数据线,传文件很不方便,王工使用AI 5分钟编写了一个小工具,电脑运行后生成二维码,手机扫码就能和电脑上传下载文件了

程序功能 自动获取本机IP地址:程序会自动检测局域网IP地址,无需手动配置 启动Web服务:在5000端口启动Flask服务器,支持文件上传和下载 生成二维码:自动创建包含访问URL的二维码,方便手机扫码访问 GUI界面:显示二维码、访问地址和操作按钮

使用步骤 运行程序后,会自动启动Web服务器 程序界面显示二维码和访问地址 用手机扫描二维码,或在浏览器中输入显示的地址 在网页中可以: 上传文件到电脑 下载电脑上的文件 删除已上传的文件 点击"打开文件夹"按钮可以查看上传的文件

技术特点 跨平台支持:支持PC、Linux和移动设备访问 安全设计:仅在局域网内提供服务,外部无法访问 文件管理:完整的文件上传、下载、删除功能 用户友好:二维码扫码访问,无需记住IP地址

注意事项 确保手机和电脑在同一局域网内 防火墙可能需要允许5000端口的访问 默认文件大小限制为100GB,可根据需要调整 上传的文件保存在程序目录下的uploads文件夹中

程序界面

mk9g9uyj.png
mk9g9uyj.png

手机扫描二维码后,可以在手机浏览器中上传下载删除文件

mk9gbcrd.png
mk9gbcrd.png

程序源码

代码语言:javascript
复制
import os
import socket
import qrcode
import tkinter as tk
from tkinter import Label, Button, filedialog, messagebox
from PIL import Image, ImageTk
from io import BytesIO
from threading import Thread
from flask import Flask, render_template_string, request, send_from_directory, redirect, url_for

# 创建Flask应用
app = Flask(__name__)
app.config['UPLOAD_FOLDER']='uploads'
app.config['MAX_CONTENT_LENGTH']=***# 100GB limit

# 确保上传文件夹存在
ifnot os.path.exists(app.config['UPLOAD_FOLDER']):
    os.makedirs(app.config['UPLOAD_FOLDER'])


# 获取本机局域网IP地址
defget_local_ip():
try:
# 创建一个UDP套接字
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 连接到一个公共DNS服务器(不实际发送数据)
        s.connect(("8.8.8.8",))
        ip = s.getsockname()[]
        s.close()
return ip
except:
# 备用方法
        hostname = socket.gethostname()
return socket.gethostbyname(hostname)


# Flask路由
@app.route('/')
defindex():
    files = os.listdir(app.config['UPLOAD_FOLDER'])
return render_template_string('''
    <!DOCTYPE html>
    <html>
    <head>
        <title>局域网文件共享</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style>
            body { font-family: Arial, sans-serif; margin: 20px; }
            .container { max-width: 800px; margin: 0 auto; }
            .upload-form { margin: 20px 0; padding: 15px; background: #f5f5f5; border-radius: 5px; }
            .file-list { margin: 20px 0; }
            .file-item { padding: 8px; border-bottom: 1px solid #ddd; }
            .file-item:hover { background: #f0f0f0; }
            .btn { padding: 8px 15px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
            .btn:hover { background: #0056b3; }
            .btn-download { background: #28a745; }
            .btn-download:hover { background: #218838; }
            .btn-delete { background: #dc3545; }
            .btn-delete:hover { background: #c82333; }
        </style>
    </head>
    <body>
        <div class="container">
            <h1>局域网文件共享</h1>

            <div class="upload-form">
                <h2>上传文件</h2>
                <form method="POST" enctype="multipart/form-data">
                    <input type="file" name="file" required>
                    <button type="submit" class="btn">上传</button>
                </form>
            </div>

            <div class="file-list">
                <h2>文件列表</h2>
                {% if files %}
                    {% for file in files %}
                        <div class="file-item">
                            <span>{{ file }}</span>
                            <a href="{{ url_for('download_file', filename=file) }}" class="btn btn-download">下载</a>
                            <a href="{{ url_for('delete_file', filename=file) }}" class="btn btn-delete" onclick="return confirm('确定要删除这个文件吗?')">删除</a>
                        </div>
                    {% endfor %}
                {% else %}
                    <p>暂无文件</p>
                {% endif %}
            </div>
        </div>
    </body>
    </html>
    ''', files=files)


@app.route('/', methods=['POST'])
defupload_file():
if'file'notin request.files:
return redirect(request.url)
file= request.files['file']
iffile.filename =='':
return redirect(request.url)
iffile:
        filename =file.filename
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('index'))


@app.route('/download/<filename>')
defdownload_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)


@app.route('/delete/<filename>')
defdelete_file(filename):
    file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
if os.path.exists(file_path):
        os.remove(file_path)
return redirect(url_for('index'))


# GUI应用程序
classFileShareApp:
def__init__(self, root):
        self.root = root
        self.root.title("局域网文件共享工具")
        self.root.geometry("400x500")

# 获取本机IP
        self.local_ip = get_local_ip()
        self.port =

# 创建UI元素
        self.create_widgets()

# 启动Flask服务器
        self.start_flask_server()

# 生成并显示二维码
        self.generate_qr_code()

defcreate_widgets(self):
# 标题
        title_label = Label(self.root, text="局域网文件共享", font=("Arial",,"bold"))
        title_label.pack(pady=)

# IP地址显示
        ip_frame = tk.Frame(self.root)
        ip_frame.pack(pady=)

        ip_label = Label(ip_frame, text="访问地址:", font=("Arial",))
        ip_label.pack(side=tk.LEFT)

        self.ip_text = Label(ip_frame, text=f"http://{self.local_ip}:{self.port}",
                             font=("Arial",,"bold"), fg="blue")
        self.ip_text.pack(side=tk.LEFT, padx=)

# 二维码显示区域
        self.qr_label = Label(self.root)
        self.qr_label.pack(pady=)

# 说明文字
        instructions = Label(self.root, text="使用手机扫描二维码\n或在浏览器中输入上述地址",
                             font=("Arial",), justify=tk.CENTER)
        instructions.pack(pady=)

# 操作按钮
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=)

        open_btn = Button(btn_frame, text="打开文件夹", command=self.open_upload_folder,
                          font=("Arial",), width=)
        open_btn.pack(side=tk.LEFT, padx=)

        refresh_btn = Button(btn_frame, text="刷新二维码", command=self.generate_qr_code,
                             font=("Arial",), width=)
        refresh_btn.pack(side=tk.LEFT, padx=)

        exit_btn = Button(btn_frame, text="退出程序", command=self.root.quit,
                          font=("Arial",), width=, bg="#dc3545", fg="white")
        exit_btn.pack(side=tk.LEFT, padx=)

defstart_flask_server(self):
"""在单独的线程中启动Flask服务器"""

defrun_server():
            app.run(host='0.0.0.0', port=self.port, debug=False)

        server_thread = Thread(target=run_server, daemon=True)
        server_thread.start()
print(f"Flask服务器已启动,访问地址: http://{self.local_ip}:{self.port}")

defgenerate_qr_code(self):
"""生成并显示二维码"""
        url =f"http://{self.local_ip}:{self.port}"

# 生成二维码
        qr = qrcode.QRCode(
            version=,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=,
            border=,
)
        qr.add_data(url)
        qr.make(fit=True)

# 创建二维码图像
        img = qr.make_image(fill_color="black", back_color="white")

# 调整大小以适应GUI
        img = img.resize((,), Image.Resampling.LANCZOS)

# 转换为Tkinter可用的格式
        img_tk = ImageTk.PhotoImage(img)

# 显示在标签上
        self.qr_label.configure(image=img_tk)
        self.qr_label.image = img_tk  # 保持引用,防止被垃圾回收

defopen_upload_folder(self):
"""打开上传文件夹"""
try:
            os.startfile(app.config['UPLOAD_FOLDER'])
except Exception as e:
            messagebox.showerror("错误",f"无法打开文件夹: {str(e)}")


defmain():
# 安装所需的库(如果未安装)
try:
import qrcode
from PIL import Image
import flask
except ImportError:
print("需要安装依赖库,请运行以下命令:")
print("pip install flask qrcode[pil] pillow")
return

# 创建主窗口
    root = tk.Tk()
    app = FileShareApp(root)
    root.mainloop()


if __name__ =="__main__":
    main()

安装依赖

代码语言:javascript
复制
pip install flask qrcode[pil] pillow

编译成exe

代码语言:javascript
复制
pyinstaller -F -w 自己的py名字.py

注释:
-F 打包为个文件
-w 隐藏窗口模式
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王忘杰的小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档