项目需求

  1. 同一局域网双向传输文件
  2. 文件目录展示,实时更新目录
  3. 可上传可下载
  4. 多文件上传
  5. 支持文件列表分页展示

概述

项目链接

已将项目打包成可执行文件,在没有python环境的电脑上应该可以运行,没测试过,就在同事电脑上运行过,发现并没什么问题,传输速率受网卡限制,理论上最低10m/s,自动检测所属IP地址,将IP地址复制发送到手机打开,如果同处一个局域网,将会弹出与电脑端一样页面,点击列表内的文件将会自动下载。

如果同处一个局域网又发现所有IP地址都不能使用,编译源代码,将main.py文件下的index函数改为以下这个,将192网段的IP地址一同写入IP地址列表再尝试。因为手机开wifi给电脑用分配的IP地址192开头的,而我使用的是公司的局域网。

# 首页
@app.route('/')
def index():# 获取所有的本机IPv4地址列表import psutilfrom socket import AddressFamilylocal_address = []for name , info in psutil.net_if_addrs().items():for addr in info:## 只放入IPv4的地址if AddressFamily.AF_INET == addr.family :#if '192' not in addr.address:local_address.append("http://"+addr.address+":5000")# print(local_addrs[0])filepath = os.path.join(os.path.dirname(os.path.abspath('__file__')),'phone_win_file\\')if not os.path.exists(filepath):os.makedirs(filepath)FileName,FileNameWithPath,FileDir = GetNameByEveryDir(filepath)page=1limit=10            start = (page - 1) * limit                end = page * limit if len(FileName) > page * limit else len(FileName)                              ret = [FileName[i] for i in range(start, end)]all_page=int(len(FileName)/limit)+1return render_template('up_video.html',file_list=ret,all_file=len(FileName),pages=page,all_page=all_page,address=local_address)

或者IP地址获取换成以下这个:

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
print(ip)

成品截图

电脑网页端



手机端


源码

main.py

# -*- coding:utf-8 -*-
from flask import *
import json,os,datetime,random
import shutil
import tkinter as tk  # 使用Tkinter前需要先导入
import _thread
import time
import tkinter.messagebox
import webbrowserapp = Flask(__name__)
app.config.from_object(__name__)
time.sleep(1)
webbrowser.open("http://127.0.0.1:5000")
def GetNameByEveryDir(file_dir):  # Input   Root Dir and get all img in per Dir.# Out     Every img with its filename and its dir and its path  FileNameWithPath = [] FileName         = []FileDir          = []for root, dirs, files in os.walk(file_dir):  for file in files:  FileNameWithPath.append(os.path.join(root, file))  # 保存图片路径FileName.append(file)                              # 保存图片名称FileDir.append(root[len(file_dir):])               # 保存图片所在文件夹return FileName,FileNameWithPath,FileDir# 首页
@app.route('/')
def index():# 获取所有的本机IPv4地址列表import psutilfrom socket import AddressFamilylocal_address = []for name , info in psutil.net_if_addrs().items():for addr in info:## 只放入IPv4的地址if AddressFamily.AF_INET == addr.family :if '192' not in addr.address:local_address.append("http://"+addr.address+":5000")# print(local_addrs[0])filepath = os.path.join(os.path.dirname(os.path.abspath('__file__')),'phone_win_file\\')if not os.path.exists(filepath):os.makedirs(filepath)FileName,FileNameWithPath,FileDir = GetNameByEveryDir(filepath)page=1limit=10            start = (page - 1) * limit                end = page * limit if len(FileName) > page * limit else len(FileName)                              ret = [FileName[i] for i in range(start, end)]all_page=int(len(FileName)/limit)+1return render_template('up_video.html',file_list=ret,all_file=len(FileName),pages=page,all_page=all_page,address=local_address)@app.route('/next_page/<int:page>/', methods=['GET'])
def next_page(page):filepath = os.path.join(os.path.dirname(os.path.abspath('__file__')),'phone_win_file\\')if not os.path.exists(filepath):os.makedirs(filepath)FileName,FileNameWithPath,FileDir = GetNameByEveryDir(filepath)limit = 10all_page=int(len(FileName)/limit)+1pages = int(page)if pages<=0:pages=1elif pages>=all_page:pages=int(all_page)                                   else:pages=int(page)                            start = (pages - 1) * limit                end = pages * limit if len(FileName) > pages * limit else len(FileName)                             ret = [FileName[i] for i in range(start, end)]return render_template('up_video.html',file_list=ret,all_file=len(FileName),pages=pages,all_page=all_page)@app.route('/phone_win_file/<file_name>', methods=['GET'])
def phone_win_file(file_name):try:filepath = os.path.join(os.path.dirname(os.path.abspath('__file__')),'phone_win_file')if not os.path.exists(filepath):os.makedirs(filepath)filename =file_name# print(file_name)file = os.path.join(filepath, filename)return send_file(file)except Exception as e:return json.dumps({'code': "502"}, ensure_ascii=False)@app.route('/up_video', methods=['post'])
def up_video():try:filepath = os.path.join(os.path.dirname(os.path.abspath('__file__')),'phone_win_file')if not os.path.exists(filepath):os.makedirs(filepath)print(request.files.getlist('file'))for f in request.files.getlist('file'):if f:filename = f.filenameupload_path = os.path.join(filepath,filename)f.save(upload_path)return render_template('up_video_ok.html')except Exception as e:# print(e)return json.dumps({'code': "502"}, ensure_ascii=False)def run_sever():app.run(host='0.0.0.0',port=5000,debug=True)if __name__ == '__main__':run_sever()

up_video.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /><title>手机电脑文件互传</title>
</head>
<style type="text/css">.my_table {font-family: 微软雅黑,verdana,arial,sans-serif;font-size:12px;color:#333333;border:solid 1px #999999;border-collapse: collapse;margin:auto;}.my_table th {background-color:#c3dde0;padding: 8px;border:solid 1px #a9c6c9;}.my_table tr {background-color:#d4e3e5;}.my_table td {padding: 8px;border:solid 1px #a9c6c9;}</style>
<body><h1 align="center">上传本地文件</h1><h2 align="center">检测到以下IP地址,请复制发送到手机上打开查看</h2>{% for i in address %}<h3 align="center"><a href="{{i}}" target=“_blank”>{{i}}</a></h3>{% endfor %}<form action="up_video" enctype='multipart/form-data' method='POST' align="center"><input type="file" name="file" style="margin-top:10px;" multiple/><input type="submit" value="上传" class="button-new" style="margin-top:10px;"/></form>
<table id="mytable" class="my_table" align="center" width='300px' cellpadding="0" cellspacing="0" border="0" style="margin-top:20px;"><tr align="center"><td>电脑端文件目录共-{{all_file}}-个</td></tr>{% for i in file_list %}<tr align="center"><td><a href="{{url_for('phone_win_file',file_name=i)}}" target=“_blank”>{{i}}</a></td></tr>{% endfor %}
</table>
<div align="center" style="margin-top:20px;"><a id="sjzl"></a> <a  href="{{url_for('index')}}" id="btn1">首页</a><a  href="{{url_for('next_page',page=pages-1)}}" id="btn2">上一页</a><a  href="{{url_for('next_page',page=pages+1)}}" id="btn3">下一页</a><a  href="{{url_for('next_page',page=all_page)}}" id="btn4">尾页</a> <a>当前 {{pages}} / {{(all_page)}} 页</a></div>
</body>
</html>

up_video_ok.html

<html><head><meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /><title>手机电脑文件互传</title></head><body><h1 align="center">文件上传成功</h1><h1 id="timer" style="color:red" align="center"></h1><span style="font-size:18px;"> </span><span style="font-size:24px;"><meta http-equiv="refresh" content="6;URL={{url_for('index')}}"> </span>
<span style="font-size:24px;"></body><SCRIPT type="text/javascript">var maxtime = 5; //按秒计算,自己调整!function CountDown() {if (maxtime >= 0) {msg = maxtime + " 秒后返回主页面";document.all["timer"].innerHTML = msg;maxtime-=1}else{clearInterval(timer);}}timer = setInterval("CountDown()", 1000);
</SCRIPT>
</html>

一百行代码自制局域网双端快速传输文件系统相关推荐

  1. 只需5行代码,手把手教你快速实现图像分割,代码逐行详解!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 转载自:量子位 图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像 ...

  2. react的导出是怎么实现的_不到一百行代码,我们来实现一个简简简简简简简简简简版react库...

    good evening everybody!这是一篇关于react故事的文章,这个故事主要是讲在一个夜黑风高晚上,react从一个VDOM变成真实DOM的过程. 这个过程react经历了从JSX-& ...

  3. 镭速发布文件直传新功能,实现端到端快速传输

    镭速V5.0.5.8版本上线啦!此次版本的更新,不仅围绕视觉体验.对象存储支持.用户通知提醒.白名单设置等方面的细节性内容做了功能升级和价值提升,也从文件高速传输上做了更多的更新和优化,使用户体验更加 ...

  4. 40行代码AC_HDU 1575 TrA 矩阵快速幂(附快速幂+矩阵快速幂的讲解)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 心路历程 1.开始看成求主对角线元素和的n次幂了,用快速幂解得.结果压根不对,又仔细看 ...

  5. 零基础用一百行代码完成动态的人脸识别(opencv+python)

    废话:(其实是介绍了一下该文章的大概来路)   电子化的时代到处都能看到人脸识别的用途:比如:刷脸门禁,火车站检票口,又比如检查站,还有一些比较高端的汽车还支持刷脸开门等等. 近期呢接了个学校的一个项 ...

  6. 43行代码AC_HDU-2604 Queuing(矩阵快速幂,附详细的知识讲解、模板例题)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 传送门3.1-->HDU-1575(经典矩阵快速幂模板题1) 传送门3.2--& ...

  7. python一百行代码多少钱_用86行Python代码模拟太阳系

    Python代码模拟的太阳系,包括了水星(Mercury), 金星(Venus),地球(Earth),月球(Moon),火星(Mars) 上面的动画是我用86行Python代码模拟的一个比较真实的太阳 ...

  8. c++获取子类窗口句柄位置_干货分享:用一百行代码做一个C/C++表白小程序,程序员的浪漫!...

    前言:很多时候,当别人听到你是程序员的时候.第一印象就是,格子衫.不浪漫.直男.但是程序员一旦浪漫起来,真的没其他人什么事了.什么纪念日,生日,情人节,礼物怎么送? 做一个浪漫的程序给她,放上你们照片 ...

  9. 一百行代码爬取漫画喵

    小喵的唠叨话:这次的博客,讲的是使用python编写一个爬虫工具.为什么要写这个爬虫呢?原因是小喵在看完<极黑的布伦希尔特>这个动画之后,又想看看漫画,结果发现各大APP都没有资源,最终好 ...

  10. 一百行代码实现微信朋友圈九宫格图片显示

    前言     很多时候我们都在刷微博或者微信朋友圈的时候都会看到很多图片,而这些图片的显示跟我们平时很多控件的显示方式都不一样,而且,当我们仔细去观察后就会发现,他加载的图片都是根据图片数量动态加载的 ...

最新文章

  1. react 项目实战(六)提取布局组件
  2. 2021-04-21--中标麒麟--yum源修改
  3. 建模就用Rose的时代宣告结束
  4. wpsppt流程图联系效果_风险隐患排查的手段—HAZOP 与检查表的区别及应用效果
  5. pixel android8,谷歌Pixel 2更多信息:安卓8.1
  6. 代码流星雨是什么形式_为什么要在2020年与流星合作
  7. python程序框架的描述_简单介绍Python下自己编写web框架的一些要点
  8. java searchterm_elasticsearch – 弹性搜索:“Term”,“Match Phrase”和“Query String”之间的差异...
  9. CVE-2020-0601漏洞详细分析
  10. Android复习准备
  11. mac新手入门:从启动台Launchpad中完全删除应用程序
  12. 笔记:MapReduce Design Patterns
  13. 很有用的SQLServer全局变量
  14. 在校大学生如何规划自己的程序员之路
  15. 新手入门 | 算法书籍推荐
  16. C1083: 无法打开包括文件:“corecrt.h”
  17. 使用ScriptableObject代替部分配置表的坑点
  18. python——田字格
  19. ipmitool 配置IP地址,账户,密码
  20. 鹰潭高通量测序建设细节概述

热门文章

  1. JSP编程中遇到的问题及解决
  2. Pycharm使用---Black代码格式化工具
  3. Win 10系统无法连接蓝牙耳机问题
  4. java 性能问题排查与性能优化
  5. c语言程序由哪三个部分组成部分,C语言程序的组成部分
  6. 一到九乘法口诀VB源码
  7. 【python教程入门学习】利用Python自动生成暴力破解的字典
  8. java ee图书管理系统_基于jsp的图书管理系统-JavaEE实现图书管理系统 - java项目源码...
  9. mapxtreme 2005 v6.6 破解
  10. IIS 搭建简单网站 并 发布项目