Hướng dẫn python send file to server - python gửi tệp đến máy chủ

Đúng. Bạn sẽ sử dụng mô -đun

pip3 install tqdm
9 và mã hóa bằng loại nội dung
import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
0. Dưới đây là một số mã mẫu để giúp bạn bắt đầu - nó không chỉ là tải lên tệp, nhưng bạn sẽ có thể đọc qua nó và xem cách thức hoạt động của nó:

user_agent = "image uploader"
default_message = "Image $current of $total"

import logging
import os
from os.path import abspath, isabs, isdir, isfile, join
import random
import string
import sys
import mimetypes
import urllib2
import httplib
import time
import re

def random_string (length):
    return ''.join (random.choice (string.letters) for ii in range (length + 1))

def encode_multipart_data (data, files):
    boundary = random_string (30)

    def get_content_type (filename):
        return mimetypes.guess_type (filename)[0] or 'application/octet-stream'

    def encode_field (field_name):
        return ('--' + boundary,
                'Content-Disposition: form-data; name="%s"' % field_name,
                '', str (data [field_name]))

    def encode_file (field_name):
        filename = files [field_name]
        return ('--' + boundary,
                'Content-Disposition: form-data; name="%s"; filename="%s"' % (field_name, filename),
                'Content-Type: %s' % get_content_type(filename),
                '', open (filename, 'rb').read ())

    lines = []
    for name in data:
        lines.extend (encode_field (name))
    for name in files:
        lines.extend (encode_file (name))
    lines.extend (('--%s--' % boundary, ''))
    body = '\r\n'.join (lines)

    headers = {'content-type': 'multipart/form-data; boundary=' + boundary,
               'content-length': str (len (body))}

    return body, headers

def send_post (url, data, files):
    req = urllib2.Request (url)
    connection = httplib.HTTPConnection (req.get_host ())
    connection.request ('POST', req.get_selector (),
                        *encode_multipart_data (data, files))
    response = connection.getresponse ()
    logging.debug ('response = %s', response.read ())
    logging.debug ('Code: %s %s', response.status, response.reason)

def make_upload_file (server, thread, delay = 15, message = None,
                      username = None, email = None, password = None):

    delay = max (int (delay or '0'), 15)

    def upload_file (path, current, total):
        assert isabs (path)
        assert isfile (path)

        logging.debug ('Uploading %r to %r', path, server)
        message_template = string.Template (message or default_message)

        data = {'MAX_FILE_SIZE': '3145728',
                'sub': '',
                'mode': 'regist',
                'com': message_template.safe_substitute (current = current, total = total),
                'resto': thread,
                'name': username or '',
                'email': email or '',
                'pwd': password or random_string (20),}
        files = {'upfile': path}

        send_post (server, data, files)

        logging.info ('Uploaded %r', path)
        rand_delay = random.randint (delay, delay + 5)
        logging.debug ('Sleeping for %.2f seconds------------------------------\n\n', rand_delay)
        time.sleep (rand_delay)

    return upload_file

def upload_directory (path, upload_file):
    assert isabs (path)
    assert isdir (path)

    matching_filenames = []
    file_matcher = re.compile (r'\.(?:jpe?g|gif|png)$', re.IGNORECASE)

    for dirpath, dirnames, filenames in os.walk (path):
        for name in filenames:
            file_path = join (dirpath, name)
            logging.debug ('Testing file_path %r', file_path)
            if file_matcher.search (file_path):
                matching_filenames.append (file_path)
            else:
                logging.info ('Ignoring non-image file %r', path)

    total_count = len (matching_filenames)
    for index, file_path in enumerate (matching_filenames):
        upload_file (file_path, index + 1, total_count)

def run_upload (options, paths):
    upload_file = make_upload_file (**options)

    for arg in paths:
        path = abspath (arg)
        if isdir (path):
            upload_directory (path, upload_file)
        elif isfile (path):
            upload_file (path)
        else:
            logging.error ('No such path: %r' % path)

    logging.info ('Done!')

& nbsp; · 8 phút Đọc · Cập nhật tháng 6 năm 2022 · Thư viện tiêu chuẩn Python · 8 min read · Updated jun 2022 · Python Standard Library

Tiết lộ: Bài đăng này có thể chứa các liên kết liên kết, có nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi nhận được hoa hồng.: This post may contain affiliate links, meaning when you click the links and make a purchase, we receive a commission.

Truyền tệp là quá trình sao chép hoặc di chuyển tệp từ máy tính này sang máy tính khác qua mạng hoặc kết nối Internet. Trong hướng dẫn này, chúng tôi sẽ từng bước về cách bạn có thể viết các tập lệnh Python máy khách/máy chủ xử lý điều đó.

Ý tưởng cơ bản là tạo một máy chủ lắng nghe trên một cổng cụ thể; Máy chủ này sẽ chịu trách nhiệm nhận các tệp (bạn cũng có thể tạo máy chủ gửi tệp). Mặt khác, máy khách sẽ cố gắng kết nối với máy chủ và gửi một tệp thuộc bất kỳ loại nào.

Chúng tôi sẽ sử dụng mô-đun

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
1, được tích hợp sẵn với Python và cung cấp cho chúng tôi các hoạt động ổ cắm được sử dụng rộng rãi trên internet, vì chúng đứng sau bất kỳ kết nối nào với bất kỳ mạng nào.

Xin lưu ý rằng có nhiều cách đáng tin cậy hơn để chuyển các tệp với các công cụ như

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
2 hoặc SCP. Tuy nhiên, mục tiêu của hướng dẫn này là chuyển các tệp bằng ngôn ngữ lập trình Python và không có bất kỳ công cụ của bên thứ ba nào.scp. However, the goal of this tutorial is to transfer files with Python programming language and without any third-party tool.

Liên quan: Cách sắp xếp các tệp bằng cách mở rộng trong Python. How to Organize Files by Extension in Python.

Đầu tiên, chúng ta sẽ cần cài đặt thư viện

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
3, cho phép chúng ta in các thanh tiến trình ưa thích:

pip3 install tqdm

Mã khách hàng

Hãy bắt đầu với máy khách, người gửi:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step

Chúng tôi cần chỉ định địa chỉ IP, cổng của máy chủ chúng tôi muốn kết nối và tên của tệp chúng tôi muốn gửi.

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
4 cần tồn tại trong thư mục hiện tại hoặc bạn có thể sử dụng một đường dẫn tuyệt đối đến tệp đó ở đâu đó trên máy tính của bạn. Đây là tệp bạn muốn gửi.

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
5 có được kích thước của tệp đó trong byte; Điều đó thật tuyệt, vì chúng tôi cần nó để hiển thị các thanh tiến trình trong máy khách và máy chủ.

Hãy tạo ổ cắm TCP:

# create the client socket
s = socket.socket()

Kết nối với máy chủ:

print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected.")

Phương pháp

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
6 hy vọng một địa chỉ của cặp
import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
7 sẽ kết nối ổ cắm với địa chỉ từ xa đó. Khi kết nối được thiết lập, chúng tôi gửi tên và kích thước của tệp:Once the connection is established, we send the name and size of the file:

# send the filename and filesize
s.send(f"{filename}{SEPARATOR}{filesize}".encode())

Tôi đã sử dụng

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
8 ở đây để tách các trường dữ liệu; Nó chỉ là một tin nhắn rác, chúng ta chỉ có thể sử dụng
import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
9 hai lần, nhưng dù sao chúng ta cũng có thể không muốn làm điều đó. Hàm
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
0 mã hóa chuỗi mà chúng tôi đã chuyển sang mã hóa 'UTF-8' (điều đó là cần thiết).'utf-8' encoding (that's necessary).

Bây giờ chúng tôi cần gửi tệp và khi chúng tôi đang gửi tệp, chúng tôi sẽ in các thanh tiến trình đẹp bằng thư viện

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
3:

# start sending the file
progress = tqdm.tqdm(range(filesize), f"Sending {filename}", unit="B", unit_scale=True, unit_divisor=1024)
with open(filename, "rb") as f:
    while True:
        # read the bytes from the file
        bytes_read = f.read(BUFFER_SIZE)
        if not bytes_read:
            # file transmitting is done
            break
        # we use sendall to assure transimission in 
        # busy networks
        s.sendall(bytes_read)
        # update the progress bar
        progress.update(len(bytes_read))
# close the socket
s.close()

Về cơ bản, những gì chúng tôi đang làm ở đây là mở tệp như được đọc bằng nhị phân (

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
2), đọc các đoạn từ tệp (trong trường hợp này là 4096 byte hoặc 4kb) và gửi chúng đến ổ cắm bằng hàm
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
3, sau đó chúng tôi cập nhật Thanh tiến độ mỗi lần, sau khi kết thúc, chúng tôi đóng ổ cắm đó.4096 bytes or 4KB) and sending them to the socket using the
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
3 function, and then we update the progress bar each time, once that's finished, we close that socket.

Liên quan: Cách tạo ứng dụng trò chuyện trong Python. How to Make a Chat Application in Python.

Mã máy chủ

Được rồi, vì vậy chúng tôi đã hoàn thành với khách hàng. Hãy đi sâu vào máy chủ, vì vậy hãy mở một tệp Python trống mới và:Let's dive into the server, so open up a new empty Python file and:

import socket
import tqdm
import os
# device's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5001
# receive 4096 bytes each time
BUFFER_SIZE = 4096
SEPARATOR = ""

Tôi đã khởi tạo một số tham số chúng tôi sẽ sử dụng. Lưu ý rằng tôi đã sử dụng "0.0.0.0" làm địa chỉ IP máy chủ. Điều này có nghĩa là tất cả các địa chỉ IPv4 trên máy cục bộ. Bạn có thể tự hỏi tại sao chúng ta không chỉ sử dụng địa chỉ IP cục bộ hoặc "localhost" hoặc "127.0.0.1"? Chà, nếu máy chủ có hai địa chỉ IP, hãy nói "192.168.1.101" trên mạng và "10.0.1.1" trên một mạng khác và máy chủ lắng nghe trên "0.0.0.0", nó sẽ có thể truy cập được ở cả hai IP đó."0.0.0.0" as the server IP address. This means all IPv4 addresses that are on the local machine. You may wonder why we don't just use our local IP address or "localhost" or "127.0.0.1"? Well, if the server has two IP addresses, let's say "192.168.1.101" on a network and "10.0.1.1" on another, and the server listens on "0.0.0.0", it will be reachable at both of those IPs.

Ngoài ra, bạn có thể sử dụng địa chỉ IP công khai hoặc riêng tư của mình, tùy thuộc vào khách hàng của bạn. Nếu các máy khách được kết nối có trong mạng cục bộ của bạn, bạn nên sử dụng IP riêng của mình (bạn có thể kiểm tra nó bằng lệnh

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
4 trong lệnh Windows hoặc
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
5 trong Mac OS/Linux), nhưng nếu bạn đang mong đợi máy khách từ Internet, bạn chắc chắn nên Sử dụng địa chỉ công cộng của bạn.

Ngoài ra, hãy đảm bảo bạn sử dụng cùng một cổng trong máy chủ như trong máy khách.

Hãy tạo ổ cắm TCP của chúng tôi:

# create the server socket
# TCP socket
s = socket.socket()

Bây giờ, điều này khác với khách hàng; Chúng ta cần liên kết ổ cắm mà chúng ta vừa tạo với

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
6 và
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
7:

pip3 install tqdm
0

Sau đó, chúng tôi sẽ lắng nghe các kết nối:

pip3 install tqdm
1

Khi máy khách kết nối với máy chủ của chúng tôi, chúng tôi cần chấp nhận kết nối đó:

pip3 install tqdm
2

Hãy nhớ rằng khi máy khách được kết nối, nó sẽ gửi tên và kích thước của tệp. Hãy nhận chúng:

pip3 install tqdm
3

Như đã đề cập trước đó, dữ liệu nhận được được kết hợp với

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
4 và
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
9 và chúng ta có thể dễ dàng trích xuất chúng bằng cách chia chúng theo chuỗi
import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
8.

Sau đó, chúng ta cần xóa đường dẫn tuyệt đối của tệp vì người gửi đã gửi tệp bằng đường dẫn tệp của riêng mình, có thể khác với chức năng

# create the client socket
s = socket.socket()
1 trả về thành phần cuối cùng của tên đường dẫn.

Bây giờ chúng ta cần nhận tệp:

pip3 install tqdm
4

Không hoàn toàn khác với mã máy khách. Tuy nhiên, chúng tôi đang mở tệp dưới dạng ghi nhị phân (

# create the client socket
s = socket.socket()
2) tại đây và sử dụng phương thức
# create the client socket
s = socket.socket()
3 để nhận byte
# create the client socket
s = socket.socket()
4 từ ổ cắm máy khách và ghi nó vào tệp. Sau khi kết thúc, chúng tôi đóng cả ổ cắm máy khách và máy chủ.

Tìm hiểu thêm: Cách liệt kê tất cả các tệp và thư mục trong máy chủ FTP bằng Python How to List all Files and Directories in FTP Server using Python

Được rồi, hãy để tôi thử nó trên mạng riêng của mình:

pip3 install tqdm
5

Tôi cần vào hộp Linux của mình và gửi một tệp ví dụ:

pip3 install tqdm
6

Hãy xem máy chủ ngay bây giờ:

pip3 install tqdm
7

Sự kết luận

Tuyệt vời, chúng tôi đã hoàn thành! Nó đang hoạt động!

Nếu bạn muốn chạy mã máy chủ trên máy từ xa chứ không phải trên mạng cục bộ, thì hãy đảm bảo bạn cho phép cổng trên tường lửa. Nếu đó là VM trong đám mây, thì hãy đảm bảo bạn cho phép nó thông qua

# create the client socket
s = socket.socket()
5:

pip3 install tqdm
8

Điều này sẽ cho tường lửa cho phép cổng đó để liên lạc từ xa. Nếu máy chủ ở trong nhà của bạn, thì bạn cần bật cổng trên cài đặt bộ định tuyến của bạn.

Bạn có thể mở rộng mã này cho nhu cầu của riêng bạn ngay bây giờ. Dưới đây là một số ví dụ bạn có thể thực hiện:

  • Cho phép máy chủ nhận được nhiều tệp từ nhiều máy khách đồng thời & nbsp; sử dụng các luồng.
  • Nén các tệp & nbsp; trước khi gửi chúng có thể giúp tăng thời gian chuyển. Nếu các tệp đích bạn muốn gửi là hình ảnh, bạn có thể & nbsp; tối ưu hóa hình ảnh bằng cách nén chúng hoặc nếu chúng là tài liệu PDF, bạn cũng có thể & NBSP; nén các tệp PDF.
  • Mã hóa tệp & nbsp; trước khi gửi nó để đảm bảo rằng không ai có thể chặn và đọc tệp đó, điều này & nbsp; Hướng dẫn & nbsp; sẽ giúp đỡ.
  • Đảm bảo tệp được gửi một cách thích hợp bằng cách kiểm tra tổng kiểm tra của cả hai tệp (tệp gốc của người gửi và tệp đã gửi trong máy thu). Trong trường hợp này, bạn cần & nbsp; Thuật toán băm an toàn & nbsp; để làm điều đó.
  • Thêm một phòng trò chuyện & nbsp; để bạn có thể trò chuyện và chuyển tệp.

Cuối cùng, nếu bạn là người mới bắt đầu và muốn học Python, tôi khuyên bạn nên tham gia khóa học Python cho mọi người Coursera, trong đó bạn sẽ học được rất nhiều về Python, chúc may mắn!

Đọc thêm: & nbsp; Cách thao tác địa chỉ IP trong Python. How to Manipulate IP Addresses in Python.

Happy Coding ♥

Xem đầy đủ mã


Cũng đọc


Hướng dẫn python send file to server - python gửi tệp đến máy chủ

Hướng dẫn python send file to server - python gửi tệp đến máy chủ


Bảng bình luận

Làm cách nào để chuyển tệp đến máy chủ trong Python?

Chuyển đến thư mục có tệp bạn muốn chia sẻ bằng cách sử dụng lệnh CD (Change thư mục). Chuyển đến thư mục với tệp bạn muốn chia sẻ bằng CD trên *Nix hoặc MacOS Systems hoặc CD cho Windows. Khởi động máy chủ HTTP của bạn bằng python -m simpleHttpserver hoặc python3 -m http. người phục vụ.

Làm cách nào để chuyển dữ liệu từ máy khách sang máy chủ trong Python?

Ngoài ra, hãy đảm bảo bạn sử dụng cùng một cổng trong máy chủ như trong máy khách.Khi máy khách kết nối với máy chủ của chúng tôi, chúng tôi cần chấp nhận kết nối đó: # chấp nhận kết nối nếu có bất kỳ client_socket, địa chỉ = s.accept () # Nếu mã bên dưới được thực thi, điều đó có nghĩa là người gửi được kết nối in (f "[+] {địa chỉ} được kết nối. ")# accept connection if there is any client_socket, address = s. accept() # if below code is executed, that means the sender is connected print(f"[+] {address} is connected.")

Làm cách nào để sử dụng Python để chuyển tệp?

Các bước để sao chép một tệp bằng Python..
Bước 1: Chụp đường dẫn ban đầu.Để bắt đầu, hãy chụp đường dẫn nơi tệp của bạn hiện đang được lưu trữ.....
Bước 2: Chụp đường dẫn đích.Tiếp theo, chụp đường dẫn đích nơi bạn muốn sao chép tệp.....
Bước 3: Sao chép tệp trong Python bằng SHOWIL.copyfile ..

Làm cách nào để tải tệp lên máy chủ FTP bằng Python?

Tạo Connection.Login đến FTP Server. Bây giờ hãy tạo một tệp giả trong thư mục hiện tại của bạn. Nhập nội dung của thư mục hiện tại trên máy chủ FTP và tải lên tệp TXT. Login to FTP server. Now create a dummy file in your current directory. Print the content of current directory on FTP server and upload the txt file.