Skip to main content

How to Instantly Share Files Over a Local Network with Python

Need to send a file from your PC to your phone, share a folder with a colleague sitting next to you, or quickly distribute files across devices on the same Wi-Fi? You don't need cloud services, USB drives, or third-party apps. Python includes a built-in HTTP server that turns any folder into a shareable file directory in seconds.

In this guide, you'll learn how to use Python's http.server module to share files over a local network, access them from any device, and understand the security implications.

The One-Line Command

Open a terminal (or Command Prompt) inside the folder you want to share and run:

python -m http.server

That's it. Your files are now being served on port 8000 by default.

Output:

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

To use a different port (e.g., 9000):

python -m http.server 9000

To bind to a specific network interface:

python -m http.server 8000 --bind 192.168.1.5
tip

If you get an error like OSError: [Errno 98] Address already in use, another process is using port 8000. Simply choose a different port number.

How to Access the Shared Files

From the Same Computer

Open your browser and navigate to:

http://localhost:8000

You'll see a directory listing of all files and folders in the directory where you started the server.

From Another Device on the Same Network

To access files from a phone, tablet, or another computer, you need your machine's local IP address.

Find your IP address:

OSCommandLook For
WindowsipconfigIPv4 Address (e.g., 192.168.1.5)
macOSifconfig or ipconfig getifaddr en0inet under en0
Linuxip a or hostname -IIP under your active interface

Then, on the other device's browser, navigate to:

http://192.168.1.5:8000

Replace 192.168.1.5 with your actual IP address. You'll see the same directory listing and can click any file to download it.

Displaying the Shareable URL Automatically

Typing IP addresses manually is tedious. Use this Python script to detect your local IP and print the ready-to-share URL:

import socket

def get_local_ip():
"""Get the local IP address of this machine."""
try:
# Connect to an external address to determine the local IP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
except Exception:
return "127.0.0.1"

local_ip = get_local_ip()
port = 8000

print(f"Share this URL with devices on your network:")
print(f" http://{local_ip}:{port}")
print(f"\nOr access locally:")
print(f" http://localhost:{port}")

Output:

Share this URL with devices on your network:
http://192.168.1.5:8000

Or access locally:
http://localhost:8000
Why not use socket.gethostbyname()?

The gethostbyname(hostname) approach sometimes returns 127.0.0.1 instead of your actual network IP, especially on Linux. The UDP socket method shown above is more reliable because it determines which interface would be used to reach an external address: without actually sending any data.

Sharing a Specific Directory

By default, the server shares the current working directory. To share a specific folder, use the --directory flag (Python 3.7+):

python -m http.server 8000 --directory /path/to/shared/folder

For example:

python -m http.server 8000 --directory ~/Documents/project-files

This keeps your other files private while sharing only the intended directory.

Creating a Simple Upload Server

The built-in http.server only supports downloading files. If you also need to upload files from another device, create a custom server:

"""Simple HTTP server with file upload support."""
import http.server
import os
import cgi

class UploadHandler(http.server.SimpleHTTPRequestHandler):
def do_POST(self):
"""Handle file uploads."""
content_type = self.headers['Content-Type']
if 'multipart/form-data' not in content_type:
self.send_error(400, "Expected multipart/form-data")
return

form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST'}
)

file_item = form['file']
if file_item.filename:
filepath = os.path.join(os.getcwd(), file_item.filename)
with open(filepath, 'wb') as f:
f.write(file_item.file.read())
self.send_response(200)
self.end_headers()
self.wfile.write(f"Uploaded: {file_item.filename}".encode())
print(f"Received: {file_item.filename}")
else:
self.send_error(400, "No file provided")

def do_GET(self):
"""Serve directory listing with an upload form."""
if self.path == '/':
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.end_headers()

files = os.listdir('.')
file_list = ''.join(f'<li><a href="{f}">{f}</a></li>' for f in sorted(files))

html = f"""
<html><body>
<h2>Upload a File</h2>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
<h2>Files</h2>
<ul>{file_list}</ul>
</body></html>
"""
self.wfile.write(html.encode())
else:
super().do_GET()

if __name__ == '__main__':
server = http.server.HTTPServer(('0.0.0.0', 8000), UploadHandler)
print("Server running at http://0.0.0.0:8000")
server.serve_forever()

Security Considerations

caution

Python's http.server is designed for convenience, not security. Keep these points in mind:

Do:

  • Use it on your trusted home or office Wi-Fi
  • Stop the server immediately after transferring files (Ctrl+C)
  • Share only the specific directory you intend to (--directory)

Don't:

  • Use it on public Wi-Fi (coffee shops, airports, hotels): anyone on the network can access your files
  • Share sensitive files (passwords, financial documents, private keys)
  • Leave the server running unattended
  • Expose it to the internet

The server uses HTTP (unencrypted) and has no authentication. All file transfers are visible to anyone monitoring the network.

Quick Reference

TaskCommand
Start server (default port 8000)python -m http.server
Start on a specific portpython -m http.server 9000
Share a specific directorypython -m http.server --directory /path/to/folder
Bind to a specific IPpython -m http.server --bind 192.168.1.5
Stop the serverCtrl+C
Access locallyhttp://localhost:8000
Access from another devicehttp://<your-ip>:8000

Summary

Python's built-in http.server module lets you share files across devices on the same network with a single command.

  • Run python -m http.server in any directory to instantly make its contents accessible via a web browser from any device on your Wi-Fi.
  • Use --directory to control which folder is shared, find your local IP with ipconfig or ip a, and always stop the server with Ctrl+C when you're done.

Remember that this server has no encryption or authentication, so use it only on trusted networks for non-sensitive files.