[Python http.server] Créer un serveur http pour télécharger/télécharger des fichiers

Motivation : L'auteur doit tester les performances de téléchargement et de téléchargement de fichiers sous l'architecture bs, je souhaite donc créer un serveur http via Python et réaliser les exigences de téléchargement et de téléchargement de fichiers entre le client et le serveur.

Difficulté : cela devrait être une chose très basique, mais l'auteur n'a jamais été exposé à la programmation http auparavant. J'aimerais enregistrer le processus d'apprentissage ici. Ce n'est peut-être pas la solution optimale.

Méthode : déployez la page HTML côté serveur, exécutez le code Python de surveillance et opérez côté client pour télécharger et télécharger des fichiers.

1 [Serveur] Créez un dossier local pour activer le service http

Ouvrez d'abord le Power Shell et créez un dossier localement sur le serveur pour activer le service http. Par exemple, créez un dossier E:\WebServer, comme indiqué dans la figure :

 Entrez Power Shell et entrez la commande :

cd E:\WebServer

Entrez la commande d'activation http :

python -m http.server

La situation suivante indique le succès :

 A ce moment, nous pouvons saisir l'adresse IP locale + le numéro de port dans la barre d'adresse du navigateur du serveur pour accéder à la page http, par exemple :

http://172.1.1.1:8000

 Quant à l'adresse IP locale, vous pouvez cliquer avec le bouton droit sur « Réseau », cliquer sur le mot bleu de votre connexion réseau et afficher l'adresse IPv4 dans les informations détaillées, comme le montre la figure :

 À ce stade, la page dans le navigateur devrait ressembler à ceci :

Lorsque vous voyez cette page, la première étape est terminée !


2 [Serveur] Écrivez un script d'écoute pour que le client télécharge des fichiers

Créez un script Python dans le dossier racine du serveur (il devrait fonctionner s'il est créé ailleurs, je ne l'ai pas essayé) :

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()

Remarque ,entrez votre propre adresse IP sur « votre serveur Web »


3 [Serveur] Écrivez un script HTML pour afficher l'interface de téléchargement du fichier

<!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>

Le code ci-dessus fait référence à : python HTTPServer implémente le téléchargement de fichiers et le blog blog-CSDN de download_xiekch  

Écrivez le code ci-dessus dans un fichier Bloc-notes, enregistrez-le en tant que fichier HTML, placez-le dans le répertoire racine du serveur et nommez-le index.html

La page http sera modifiée selon le style prédéterminé. Autrement dit, lorsque la page http sera à nouveau ouverte à ce moment-là, elle devrait apparaître :


4 [Client] Écrivez un script pour télécharger des fichiers

Utilisez un autre ordinateur pour agir en tant que client et écrivez un script Python pour télécharger des fichiers :

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("文件上传失败!")

Notez également ,entrez votre adresse IP dans 'votre serveur web' et écrivez le chemin du fichier dans votre chemin de fichier

Sous les systèmes Windows, le chemin du fichier peut utiliser des doubles barres obliques :

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

 Sous le système MacOS, les formats suivants peuvent actuellement être utilisés pour les tests :

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

[Client] Écrivez un script pour télécharger des fichiers

De même, utilisez un autre fichier Python pour écrire un script de téléchargement de fichier :

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)

Encore une fois ,entrez votre adresse IP sur « votre serveur Web »


[Client] Effet de mise en œuvre

Une fois les étapes ci-dessus entièrement préparées, exécutez le script d'écoute [server] . À ce stade, la fenêtre Terminal de l'IDE Python devrait inviter :

En même temps, le script doit être exécuté en permanence (si le bouton stop est actuellement affiché, cela signifie qu'il s'exécute en continu) pour continuer à surveiller :

 À ce stade, exécutez le script de téléchargement du fichier de [Client] pour télécharger le fichier cible sur le serveur. L'auteur a également écrit une fonction pour enregistrer le temps de téléchargement. Les résultats suivants indiquent que le téléchargement a réussi. Bien sûr, vous pouvez utilisez également une méthode similaire pour télécharger. Le mécanisme de jugement du script de demande de prix détermine si le fichier est téléchargé avec succès.

Saisissez l'adresse http du serveur dans [Client] et sélectionnez un fichier local à télécharger :

De même, le message suivant apparaît sur le terminal d'écoute [serveur] , indiquant que le téléchargement a réussi :

 Un fichier temporaire apparaîtra dans le répertoire racine de [Serveur] . Si vous devez poursuivre le traitement du fichier temporaire, vous pouvez modifier davantage le script.

Révision 230524 : Vous devez accéder à la page de téléchargement du fichier sur le client avant d'exécuter le script de surveillance côté serveur, sinon une erreur se produira. Comme cela n'affecte pas l'implémentation de la fonction pour le moment, la cause n'a pas encore été étudiée. 


La fin

Je suppose que tu aimes

Origine blog.csdn.net/Norths_/article/details/130728255
conseillé
Classement