動機:作成者は 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'
5 [クライアント]ファイルをダウンロードするスクリプトを作成する
同様に、別の 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 アドレスを入力します。
6 【クライアント】導入効果
上記の手順が完全に準備できたら、[server] listen スクリプトを実行します。この時点で、Python IDE のターミナル ウィンドウに次のプロンプトが表示されます。
同時に、監視を続けるために、スクリプトは常に実行されている必要があります (停止ボタンが現在表示されている場合は、継続的に実行されていることを意味します)。
このとき、[クライアント]のダウンロード ファイル スクリプトを実行して、対象ファイルをサーバーにダウンロードします。作者はダウンロード時間を記録する関数も作成しています。次の結果は、ダウンロードが成功したことを示します。もちろん、ファイルのダウンロードが成功したかどうかは、価格照会スクリプトの判定機構によって判断されます。
[クライアント]にサーバーの http アドレスを入力し、アップロードするローカル ファイルを選択します。
同様に、[サーバー]リスニング端末に次のメッセージが表示され、アップロードが成功したことを示します。
[Server] のルート ディレクトリに一時ファイルが表示されます。一時ファイルをさらに処理する必要がある場合は、スクリプトをさらに変更できます。
リビジョン 230524 : サーバー側監視スクリプトを実行する前に、クライアントでファイルアップロードページに入らなければエラーが発生しますが、現時点では機能実装に影響はないため、原因は未調査です。
終わり