USBもクラウドも使えない!絶望的な状況を救うPythonの簡易HTTPサーバー

みなさん、こんにちは。

今回は、先日あるイベントで遭遇した「絶望的なファイル共有問題」と、その場を切り抜けるためのPythonでの解決策についてお話ししたいと思います。

開発者やエンジニアであれば、きっと同じような経験があるのではないでしょうか。

 


 

イベントで突然発生した「ファイル共有難民」

 

先日、とある技術系のイベントに参加したときのことです。複数のチームで作業を進める中で、急遽、参加者間で大きなデータを共有する必要が生じました。しかし、ここで一つの大きな壁にぶつかりました。

  • USBメディアはセキュリティの関係で利用できない
    • 一部の参加者のPCに厳格なセキュリティポリシーが適用されており、外部ストレージの使用が一切許可されていませんでした。
  • 低速なインターネット環境
    • 会場のWi-Fiは非常に不安定で、インターネット回線が異常に遅い状態でした。クラウドストレージはもちろん、SlackやDiscordのようなチャットツールでさえ、ファイルのアップロードに途方もない時間がかかり、実質的に利用不能でした。

参加者はWindows、Mac、Linuxと多様なOS環境で、ローカルネットワーク内で直接ファイルを共有する方法を探しましたが、どのOSでも標準機能での共有は設定が煩雑で、手間取っているうちに作業は停滞してしまいました。まさに「ファイル共有難民」の発生です。

 


 

一筋の光か? ShareDropの落とし穴

 

誰かが「ブラウザだけでP2Pファイル転送ができるShareDropを使ってみては?」と提案してくれました。これはブラウザを介して同じネットワーク内のデバイスと直接ファイルを共有できる、非常に便利なツールです。もし使えるなら、まさにこの状況にぴったりのソリューションでした。

しかし、これもまた期待外れに終わってしまいました。以前はローカルネットワーク内で直接通信する仕様だったのですが、残念ながら、近年の仕様変更でファイルが一度クラウドストレージを経由する形になっていました。低速なインターネット環境下では結局使い物にならず、この選択肢も消えてしまいました。

 


 

サーバーを立てる? イベント中にできることには限りがある

 

「いっそのこと、誰かがローカルにサーバーを立てればいいのでは?」という考えが頭をよぎりました。ファイル共有サーバーやFTPサーバー、あるいは簡易的なWebサーバーを立てるというアイデアです。

確かに、これなら解決できます。しかし、いざやろうとすると、いくつかの問題があります。

  • 準備の煩雑さ
    • イベントの最中にサーバーを立てるには、手間と時間がかかります。共有フォルダの指定、アクセス権限の設定、ポートの開放、ファイアウォールの設定など、その場ですべてを完璧に行うのは至難の業です。
  • 環境依存
    • サーバーソフトウェアのインストールが必要な場合、参加者のOS環境に左右される可能性もあります。

結局、これらの準備の煩雑さから、今回は泣く泣くファイル共有を諦めることになってしまいました。

 


 

Pythonが救う!即席で使える簡易ファイル共有サーバー

 

この悔しい経験から、「今後、同じような事態に遭遇しないために、サッと使えるツールを作っておこう」と決心しました。そこで目を付けたのが、Pythonの標準ライブラリであるhttp.serverです。

Pythonは多くのOSに標準で搭載されており、環境構築の手間がほとんどかかりません。そして、http.serverを使えば、たった数行のコードで簡易的なHTTPサーバーを立ち上げることができます。

以下のスクリプトは、指定したディレクトリをローカルネットワーク内で共有するためのものです。

import os
import sys
from http.server import SimpleHTTPRequestHandler, HTTPServer

def start_http_server(folder_path, port=8080):
    """
    指定されたフォルダを公開するHTTPサーバーを起動します。
    """
    try:
        # スクリプトを実行したディレクトリをカレントディレクトリとして設定
        os.chdir(folder_path)
        
        # SimpleHTTPRequestHandlerとHTTPServerを使ってサーバーをセットアップ
        # "0.0.0.0"を指定することで、ローカルネットワーク内のすべてのインターフェースからアクセス可能になります。
        httpd = HTTPServer(("0.0.0.0", port), SimpleHTTPRequestHandler)
        
        print(f"HTTP server running at http://0.0.0.0:{port}/")
        print(f"Sharing folder: {os.getcwd()}")
        print("Press Ctrl+C to stop the server.")
        
        # サーバーを永久に実行
        httpd.serve_forever()

    except KeyboardInterrupt:
        print("\nStopping HTTP server...")
        httpd.server_close()
        sys.exit(0)
    except Exception as e:
        print(f"An error occurred: {e}")
        sys.exit(1)

def main():
    """
    メイン関数:共有するフォルダのパスを取得し、サーバーを起動します。
    """
    # コマンドライン引数から共有フォルダのパスを取得
    # 引数がない場合はカレントディレクトリを共有
    if len(sys.argv) > 1:
        folder_path = sys.argv[1]
    else:
        folder_path = os.getcwd()

    if not os.path.isdir(folder_path):
        print(f"Error: '{folder_path}' is not a valid directory.")
        sys.exit(1)

    # HTTPサーバーを起動
    start_http_server(folder_path)

if __name__ == "__main__":
    main()

このスクリプトをshare_server.pyとして保存し、以下のように実行するだけです。

# カレントディレクトリを共有する場合
python share_server.py

# 特定のディレクトリを共有する場合
python share_server.py /path/to/share/folder

たったこれだけで、指定したフォルダがHTTPサーバーとして公開されます。

他の参加者は、サーバーを立てたPCのIPアドレスとポート番号(例:http://192.168.1.100:8080)をブラウザに入力するだけで、共有フォルダの中身を閲覧し、ファイルをダウンロードできます。

参加者全員のダウンロードが終わったら、Ctrl + c でスクリプトを終了させればよいだけです。

この方法のメリットは以下の通りです。

  • 手軽さ
    • Pythonさえインストールされていれば、特別なライブラリのインストールは不要です。
  • クロスプラットフォーム
    • Webブラウザさえあれば、Windows、Mac、Linux、さらにはスマートフォンからもアクセス可能です。
  • 即応性
    • 準備に時間をかけることなく、その場でサーバーを立ち上げられます。

ただし、以下2つの確認を忘れてはなりません。

  1. ファイアウォールの設定
    • サーバー側のPCで、指定したポート(デフォルトは8080)へのアクセスが許可されているか確認が必要です。
  2. セキュリティ
    • この方法はあくまで一時的なローカルネットワーク内での共有を想定しています。インターネットに直接公開するような使い方は避けるべきです。

 


 

まとめ – 備えあれば憂いなし

 

今回の経験から学んだのは、「イベントには想定外のトラブルがつきもの」ということです。特に、セキュリティやネットワーク環境に関する制約は、予期せぬ形で作業を妨げます。

手軽に使えるPythonの簡易HTTPサーバーは、そのような状況を打開するための強力なツールとなり得ます。たった一本のスクリプトを用意しておくだけで、いざという時に困ることはありません。

皆さんも、いざという時のために、このような「お守り」的なツールをいくつか準備しておいてはいかがでしょうか。今回作成したスクリプトはGitHubで公開していますので、もしよろしければご活用ください。

 

今回も最後までお読みいただきありがとうございました。

それでは、よいイベントライフを!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール