【Python http.server】ファイルをダウンロード・アップロードするためのhttpサーバーを構築する

動機:作成者は bs アーキテクチャの下でファイルのアップロードとダウンロードのパフォーマンスをテストする必要があるため、Python を介して http サーバーを構築し、クライアントとサーバー間のファイルのアップロードとダウンロードの要件を実現したいと考えています。

難易度:これは非常に基本的なことですが、著者はこれまで http プログラミングに触れたことはありません。学習プロセスをここに記録したいと思います。最適な解決策ではない可能性があります。

方法:サーバー側で HTML ページをデプロイし、監視用の Python コードを実行し、クライアント側でファイルのアップロードとダウンロードを実行します。

1 [サーバー] httpサービスを有効にするローカルフォルダーを作成します

まず、Power Shell を開き、サーバー上にローカルにフォルダーを作成して、http サービスを有効にします。たとえば、図に示すように、E:\WebServer フォルダーを作成します。

 Power Shell に入り、次のコマンドを入力します。

cd E:\WebServer

Enable http コマンドを入力します。

python -m http.server

次の状況は成功を示します。

 この時点で、サーバーのブラウザのアドレス バーにローカル IP アドレスとポート番号を入力して、http ページにアクセスできます。次に例を示します。

http://172.1.1.1:8000

 ローカル IP アドレスについては、「ネットワーク」を右クリックし、ネットワーク接続の青い文字をクリックすると、図に示すように、詳細情報で IPv4 アドレスが表示されます。

 この時点で、ブラウザのページは次のように表示されるはずです。

このページが表示されたら、最初のステップは完了です。


2 [サーバー]クライアントがファイルをアップロードするためのリスニング スクリプトを作成します。

サーバーのルート フォルダーに Python スクリプトを作成します (他の場所に作成しても機能するはずですが、私は試していません)。

from http.server import BaseHTTPRequestHandler, HTTPServer
import time


# 创建自定义的请求处理类
class FileUploadHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        start_time = time.time()
        content_length = int(self.headers['Content-Length'])
        # 读取客户端发送的二进制文件数据
        file_data = self.rfile.read(content_length)

        # 在这里可以对接收到的文件数据进行处理,例如保存到磁盘
        with open('uploaded_file.bin', 'wb') as file:
            file.write(file_data)

        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'File uploaded successfully.')

        end_time = time.time()
        time_elapsed_ms = int((end_time - start_time) * 1000)
        print(f"Update in {time_elapsed_ms} ms")


# 启动服务器
def run_server():
    server_address = ('your web server', 8000)  # 可以根据需要修改端口号
    httpd = HTTPServer(server_address, FileUploadHandler)
    print('Server running on port 8000...')
    httpd.serve_forever()


# 运行服务器
run_server()

:「Web サーバー」には自分の IP アドレスを入力してください


3 [サーバー]アップロードファイルのインターフェースを表示するHTMLスクリプトを記述する

<!DOCTYPE html>
<html>

<head>
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.6.0.js" type="text/javascript"></script>
    <!-- <script src="./jquery-3.6.0.js" type="text/javascript"></script> -->
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head>

<body>
    <form id="uploadForm" action="/upload" enctype="multipart/form-data" method="post" onsubmit="return submitFile()">
        <div><input type="file" name="file" multiple></div>
        <br>
        <div><input type="submit" value="upload"> </div>
    </form>
    <script>
        function submitFile() {
            // formData = new FormData($('#uploadForm')[0])
            files = $('#uploadForm')[0].file.files
            for (i = 0; i < files.length; i++) {
                $.ajax({
                    url: "/upload?fileName=" + encodeURIComponent(files[i].name),
                    type: "POST",
                    data: files[i],
                    success: function (data) {
                        console.info("success", data);
                    },
                    error: function (data) {
                        console.warn("fail", data);
                    },
                    processData: false,
                    contentType: "multipart/form-data",
                    // contentType: "application/octet-stream"
                });
            }
            return false;
        }
    </script>
</body>

</html>

上記のコードは以下を参照しています: Python HTTPServer はファイルのアップロードと download_xiekch のブログを実装します - CSDN ブログ  

上記のコードをメモ帳ファイルに書き込み、HTML ファイルとして保存し、サーバーのルート ディレクトリに置き、index.htmlという名前を付けます。

http ページが所定のスタイルに変更されます。つまり、この時点で http ページを再度開くと、次のように表示されます。


4 [クライアント]ファイルをアップロードするスクリプトを作成する

別のコンピューターをクライアントとして使用し、ファイルをアップロードするための Python スクリプトを作成します。

import requests
import os

# 指定服务器URL和要上传的文件路径
server_url = 'http://your web server:8000/upload'
file_path = '/your file path/file.bin'

testResponse = requests.get(server_url)
if testResponse.status_code == 200:
    print("与服务器的连接正常!")
else:
    print("无法连接到服务器!")

with open(file_path, 'rb') as file:
    file_data = file.read()

response = requests.post(server_url, files={'file': 'file'})

if response.status_code == 200:
    print("文件上传成功!")
else:
    print("文件上传失败!")

また「Web サーバー」にIP アドレスを入力し、ファイル パスにファイル パスを記述することに

Windows システムでは、ファイル パスに二重スラッシュを使用できます。

http://172.1.1.1:8000//data.bin

 MacOS システムでは、現在、次の形式をテストに使用できます。

'/users/north/desktop/data.bin'

[クライアント]ファイルをダウンロードするスクリプトを作成する

同様に、別の Python ファイルを使用して、ダウンロード ファイル スクリプトを作成します。

import time
import requests

response = requests.get("http://your web server:8000//file.bin")
with open("data.bin", "wb") as f:
f.write(response.content)

もう一度「Web サーバー」に IP アドレスを入力します。


【クライアント】導入効果

上記の手順が完全に準備できたら、[server] listen スクリプトを実行します。この時点で、Python IDE のターミナル ウィンドウに次のプロンプトが表示されます。

同時に、監視を続けるために、スクリプトは常に実行されている必要があります (停止ボタンが現在表示されている場合は、継続的に実行されていることを意味します)。

 このとき、[クライアント]のダウンロード ファイル スクリプトを実行して、対象ファイルをサーバーにダウンロードします。作者はダウンロード時間を記録する関数も作成しています。次の結果は、ダウンロードが成功したことを示します。もちろん、ファイルのダウンロードが成功したかどうかは、価格照会スクリプトの判定機構によって判断されます。

[クライアント]にサーバーの http アドレスを入力し、アップロードするローカル ファイルを選択します。

同様に、[サーバー]リスニング端末に次のメッセージが表示され、アップロードが成功したことを示します。

 [Server] のルート ディレクトリに一時ファイルが表示されます。一時ファイルをさらに処理する必要がある場合は、スクリプトをさらに変更できます。

リビジョン 230524 : サーバー側監視スクリプトを実行する前に、クライアントでファイルアップロードページに入らなければエラーが発生しますが、現時点では機能実装に影響はないため、原因は未調査です。 


終わり

おすすめ

転載: blog.csdn.net/Norths_/article/details/130728255