开发原因现在的手机和电脑连接,总是要装什么软件或者用数据线,传文件很不方便,王工使用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 隐藏窗口模式