Отправьте файл и имя файла с помощью Python

#python #sockets

#python #сокеты

Вопрос:

Я хочу создать очень простой сервер, который принимает файлы разных типов от клиентов. Проблема в том, что я не могу получить имя файла, отправленное с клиента, поэтому все файлы сохраняются как одно имя файла, независимо от того, как называется файл.

Это мой client.py:

 import socket
with socket.socket() as s:
    s.connect(('192.168.1.2',10000))
    with open('Image.jpg','rb') as f:
        s.sendall(f.read())
  

И это мой server.py:

 import socket
print("Server started")
while True:
        with socket.socket() as s:
            s.bind(('192.168.1.2',10000))
            s.listen(1)
            with s.accept()[0] as c:
                chunks = []
                while True:
                    chunk = c.recv(4096)
                    if not chunk: break
                    chunks.append(chunk)
                    print("Receiving file")
            with open('Image.jpg','wb') as f:
                f.write(b''.join(chunks))
                print("File Received")
  

Который работает нормально. Проблема начинается с того, что если я отправлю другой файл, например «data.csv», он все равно будет сохранен как «Image.jpg «на сервере.

Есть ли какой-либо способ сохранить имя файла вместе с файлом?

Комментарии:

1. Может быть, вы могли бы включить это в качестве заголовка или в виде сообщения перед изображением?

2. Отправка файлов в виде открытого текста в наши дни не самая лучшая идея, вы рассматривали возможность использования scp ?

3. Вам нужно будет создать проводной протокол, который позволяет включать имя файла (или использовать тот, который уже может это делать, например, ftp …)

Ответ №1:

Что я обычно делаю, так это отправляю имя файла перед данными:

 import socket
print("Server started")
while True:
        with socket.socket() as s:
            s.bind(('192.168.1.2',10000))
            s.listen(1)
            with s.accept()[0] as c:
                chunks = []
                while True:
                    filename = c.recv(1600)
                    filename = filename.decode()
                    chunk = c.recv(4096)
                    if not chunk: break
                    chunks.append(chunk)
                    print("Receiving file")
            with open(filename,'wb') as f:
                f.write(b''.join(chunks))
                print("File Received")
  

Клиент:

 import socket
import time
with socket.socket() as s:
    s.connect(('192.168.1.2',10000))
    with open('Image.jpg','rb') as f:
        s.sendall('Image.jpg'.encode())
        time.sleep(3)
        s.sendall(f.read())