[Python http.server] Cree un servidor http para descargar/cargar archivos

Motivación: el autor necesita probar el rendimiento de carga y descarga de archivos bajo la arquitectura bs, por lo que quiero construir un servidor http a través de Python y cumplir con los requisitos de carga y descarga de archivos entre el cliente y el servidor.

Dificultad: esto debería ser algo muy básico, pero el autor nunca antes ha estado expuesto a la programación http. Me gustaría registrar el proceso de aprendizaje aquí. Puede que no sea la solución óptima.

Método: implemente la página html en el lado del servidor, ejecute el código Python de monitoreo y opere en el lado del cliente para cargar y descargar archivos.

1 [Servidor] Cree una carpeta local para habilitar el servicio http

Primero abra Power Shell y cree una carpeta localmente en el servidor para habilitar el servicio http. Por ejemplo, cree una carpeta E:\WebServer, como se muestra en la figura:

 Ingrese a power shell e ingrese el comando:

cd E:\WebServer

Ingrese el comando habilitar http:

python -m http.server

La siguiente situación indica éxito:

 En este momento, podemos ingresar la dirección IP local + número de puerto en la barra de direcciones del navegador del servidor para acceder a la página http, por ejemplo:

http://172.1.1.1:8000

 En cuanto a la dirección IP local, puede hacer clic derecho en "Red", hacer clic en la palabra azul de su conexión de red y ver la dirección IPv4 en la información detallada, como se muestra en la figura:

 En este punto, la página en el navegador debería verse así:

Cuando vea esta página, ¡el primer paso estará completo!


2 [Servidor] Escriba un script de escucha para que el cliente cargue archivos

Cree un script de Python en la carpeta raíz del servidor (debería funcionar si se crea en otro lugar, no lo he probado):

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

Nota :introduzca su propia dirección IP en 'su servidor web'


3 [Servidor] Escriba un script html para mostrar la interfaz de carga de archivos

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

El código anterior se refiere a: Python HTTPServer implementa la carga de archivos y el blog-CSDN de download_xiekch  

Escriba el código anterior en un archivo de bloc de notas, guárdelo como un archivo html, colóquelo en el directorio raíz del servidor y asígnele el nombre index.html .

La página http se cambiará al estilo predeterminado, es decir, cuando la página http se abra nuevamente en este momento, debería aparecer:


4 [Cliente] Escribe un script para subir archivos

Utilice otra computadora para actuar como cliente y escriba un script de Python para cargar archivos:

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

También tenga en cuenta queingrese su dirección IP en 'su servidor web' y escriba la ruta del archivo en su ruta de archivo.

En los sistemas Windows, la ruta del archivo puede utilizar barras dobles:

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

 En el sistema MacOS, actualmente se pueden utilizar los siguientes formatos para realizar pruebas:

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

[Cliente] Escribe un script para descargar archivos

De manera similar, use otro archivo Python para escribir un script de archivo de descarga:

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)

Nuevamente ,ingrese su dirección IP en 'su servidor web'


[Cliente] Efecto de implementación

Una vez que los pasos anteriores estén completamente preparados, ejecute el script de escucha [servidor] En este momento, la ventana Terminal del IDE de Python debería indicar:

Al mismo tiempo, el script debe estar ejecutándose todo el tiempo (si el botón de detener se muestra actualmente, significa que se está ejecutando continuamente) para continuar monitoreando:

 En este momento, ejecute el script de descarga del archivo de [Cliente] para descargar el archivo de destino en el servidor. El autor también ha escrito una función para registrar el tiempo de descarga. Los siguientes resultados indican que la descarga se realizó correctamente. Por supuesto, puede también utilice un método similar para cargar El mecanismo de evaluación del script de consulta de precios determina si el archivo se descarga correctamente.

Ingrese la dirección http del servidor en [Cliente] y seleccione un archivo local para cargar:

De manera similar, aparece el siguiente mensaje en el terminal de escucha del [servidor] , indicando que la carga se realizó correctamente:

 Aparecerá un archivo temporal en el directorio raíz de [Servidor] . Si necesita procesar más el archivo temporal, puede modificar aún más el script.

Revisión 230524 : Debe ingresar a la página de carga del archivo en el cliente antes de ejecutar el script de monitoreo del lado del servidor; de lo contrario, se producirá un error. Dado que no afecta la implementación de la función por el momento, la causa aún no se ha estudiado. 


El fin

Supongo que te gusta

Origin blog.csdn.net/Norths_/article/details/130728255
Recomendado
Clasificación