【python】使用python在局域网高速分享文件

如果你需要在局域网分享文件,可以使用QQ微信等办公软件挺方便的,但是如果是大文件,比如说好几G的,先不说速度慢,由于限制,还不一定能发给别人

但如果你的电脑上安装了python(没有的话也可以自己安装一个,占用资源很小),我们可以使用它自带的http模块运行一个http服务,这样局域网内的设备都能通过浏览器去访问和下载文件了

由于走的是局域网路线,所以传输速度基本上取决于你的路由器或交换机的速度

1.命令行模式

打开cmd或者powershell,使用python命令启动http.server模块

python -m http.server 端口  # 端口可以不写,默认是8000

它提示成功之后我们就可以在浏览器根据你的ip端口进行访问了,此处ip是局域网ip,可以通过在cmd输入ipconfig查看你本机局域网ip
在这里插入图片描述

2.封装代码

上面的步骤是先进入你要分享的文件夹然后再运行http服务,而且还需要手动查看本机ip,最关键是没有指定utf-8编码,在线预览文本时中文字符可能会显示乱码, 因此,我们完全可以对默认代码进一步封装,把这些步骤全部整合在一起,把py文件的默认打开方式改为python,即把封装好的脚本复制到你要分享的文件夹,然后双击运行即可

import contextlib
import os
import socket
import sys
import argparse
import traceback
from functools import partial
from http.server import BaseHTTPRequestHandler, CGIHTTPRequestHandler, SimpleHTTPRequestHandler, ThreadingHTTPServer


def _get_best_family(*address):
    infos = socket.getaddrinfo(
        *address,
        type=socket.SOCK_STREAM,
        flags=socket.AI_PASSIVE,
    )
    family, type, proto, canonname, sockaddr = next(iter(infos))
    return family, sockaddr


def test(HandlerClass=BaseHTTPRequestHandler, ServerClass=ThreadingHTTPServer,
         protocol="HTTP/1.0", port=8000, bind=None):
    """Test the HTTP request handler class.

    This runs an HTTP server on port 8000 (or the port argument).

    """
    ServerClass.address_family, addr = _get_best_family(bind, port)

    HandlerClass.protocol_version = protocol
    with ServerClass(addr, HandlerClass) as httpd:
        host, port = httpd.socket.getsockname()[:2]
        url_host = f'[{host}]' if ':' in host else host
        print(
            f"Serving HTTP on {host} port {port} "
            f"(http://{url_host}:{port}/) ..."
        )
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\nKeyboard interrupt received, exiting.")
            sys.exit(0)


def runserver(port=8000, path=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('--cgi', action='store_true', help='Run as CGI Server')
    parser.add_argument('--bind', '-b', metavar='ADDRESS', help='Specify alternate bind address '
                                                                '[default: all interfaces]')
    parser.add_argument('--directory', '-d', help='Specify alternative directory '
                                                  '[default:current directory]')
    parser.add_argument('port', action='store',
                        default=port, type=int,
                        nargs='?',
                        help='Specify alternate port [default: 8000]')
    args = parser.parse_args()
    extensions_map = SimpleHTTPRequestHandler.extensions_map
    extensions_map.update({".txt": "text/plain", ".py": "text/plain", ".md": "text/plain"})
    extensions_map = {k: "{}; charset=utf-8".format(v) for k, v in extensions_map.items() if not v.endswith("utf-8")}
    SimpleHTTPRequestHandler.extensions_map = extensions_map
    dir_ = args.directory if args.directory else path
    dir_ = dir_ if dir_ else os.getcwd()
    if args.cgi:
        handler_class = CGIHTTPRequestHandler
    else:
        handler_class = partial(SimpleHTTPRequestHandler, directory=dir_)

    # ensure dual-stack is not disabled; ref #38907
    class DualStackServer(ThreadingHTTPServer):
        def server_bind(self):
            # suppress exception when protocol is IPv4
            with contextlib.suppress(Exception):
                self.socket.setsockopt(
                    socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
            return super().server_bind()

    test(
        HandlerClass=handler_class,
        ServerClass=DualStackServer,
        port=args.port,
        bind=args.bind,
    )


def get_host_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(('8.8.8.8', 80))
        local_ip = s.getsockname()[0]
    finally:
        s.close()
    return local_ip


if __name__ == '__main__':
    print("""
    使用说明:
    1.请确保该路径以及子路径没有 --敏感文件--
    2.仅限局域网访问(比如大家都连接同一个路由器)
    3.共享路径是运行该程序的文件夹,局域网内所有人都能访问和下载文件
    """)
    share_path = os.getcwd()  # 路径
    port = 80  # 端口
    print("共享路径: {}, 端口:{}".format(share_path, port))
    try:
        ip = get_host_ip()
        print("请在浏览器访问URL:http://{}:{}".format(ip, port))
        runserver(port)
    except Exception as e:
        print("启动程序失败:{}, {}".format(e, traceback.format_exc()))

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰冷的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值