当前位置:首页>python>python3开发用于windows、linux和安卓苹果手机平板等设备 局域网文件共享工具

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

  • 2026-10-21 13:29:57
python3开发用于windows、linux和安卓苹果手机平板等设备 局域网文件共享工具

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

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

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

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

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

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

程序源码

import osimport socketimport qrcodeimport tkinter as tkfrom tkinter import Label, Button, filedialog, messageboxfrom PIL import Image, ImageTkfrom io import BytesIOfrom threading import Threadfrom 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']=100*1024*1024*1024# 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",80))        ip = s.getsockname()[0]        s.close()return ipexcept:# 备用方法        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.filenamefile.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 =5000# 创建UI元素        self.create_widgets()# 启动Flask服务器        self.start_flask_server()# 生成并显示二维码        self.generate_qr_code()defcreate_widgets(self):# 标题        title_label = Label(self.root, text="局域网文件共享", font=("Arial",16,"bold"))        title_label.pack(pady=20)# IP地址显示        ip_frame = tk.Frame(self.root)        ip_frame.pack(pady=10)        ip_label = Label(ip_frame, text="访问地址:", font=("Arial",10))        ip_label.pack(side=tk.LEFT)        self.ip_text = Label(ip_frame, text=f"http://{self.local_ip}:{self.port}",                             font=("Arial",10,"bold"), fg="blue")        self.ip_text.pack(side=tk.LEFT, padx=5)# 二维码显示区域        self.qr_label = Label(self.root)        self.qr_label.pack(pady=20)# 说明文字        instructions = Label(self.root, text="使用手机扫描二维码\n或在浏览器中输入上述地址",                             font=("Arial",10), justify=tk.CENTER)        instructions.pack(pady=10)# 操作按钮        btn_frame = tk.Frame(self.root)        btn_frame.pack(pady=20)        open_btn = Button(btn_frame, text="打开文件夹", command=self.open_upload_folder,                          font=("Arial",10), width=12)        open_btn.pack(side=tk.LEFT, padx=5)        refresh_btn = Button(btn_frame, text="刷新二维码", command=self.generate_qr_code,                             font=("Arial",10), width=12)        refresh_btn.pack(side=tk.LEFT, padx=5)        exit_btn = Button(btn_frame, text="退出程序", command=self.root.quit,                          font=("Arial",10), width=12, bg="#dc3545", fg="white")        exit_btn.pack(side=tk.LEFT, padx=5)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=1,            error_correction=qrcode.constants.ERROR_CORRECT_L,            box_size=10,            border=4,)        qr.add_data(url)        qr.make(fit=True)# 创建二维码图像        img = qr.make_image(fill_color="black", back_color="white")# 调整大小以适应GUI        img = img.resize((200,200), 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 qrcodefrom PIL import Imageimport flaskexcept ImportError:print("需要安装依赖库,请运行以下命令:")print("pip install flask qrcode[pil] pillow")return# 创建主窗口    root = tk.Tk()    app = FileShareApp(root)    root.mainloop()if __name__ =="__main__":    main()

安装依赖

pip install flask qrcode[pil] pillow

编译成exe

pyinstaller -F -w 自己的py名字.py注释:-F 打包为1个文件-w 隐藏窗口模式

最新文章

随机文章