簡體   English   中英

在Python中通過HTTP從客戶端到服務器流式傳輸未知大小的數據

[英]Streaming data of unknown size from client to server over HTTP in Python

不幸的是,我之前的問題因為是一個問題的“精確副本”而被關閉,而它絕對不是,特此再次。

它不是Python的重復:HTTP發布帶有流的大文件

那個處理流式傳輸大文件; 我想將一個文件的任意塊一個接一個地發送到同一個http連接。 所以我有一個20 MB的文件,我想要做的是打開HTTP連接,然后發送1 MB,再發送1 MB等,直到它完成。 使用相同的連接,服務器看到該連接上出現一個20 MB的塊。

我也打算做一個Mmapping文件,但是當從stdin讀取數據時這不起作用。 主要針對第二種情況,我正在尋找這種逐個數據饋送。

老實說,我想知道它是否可以完成 - 如果沒有,我想知道,那么可以關閉這個問題。 但如果可以做到,怎么辦呢?

從客戶的角度來看,這很容易。 您可以使用httplib的低級接口 - putrequestputheaderendheaderssend - 以任意大小的塊發送任何您想要的服務器。

但是您還需要指出文件的結束位置。

如果您事先知道文件的總大小,則可以只包含Content-Length標頭,服務器將在那么多字節后停止讀取您的請求主體。 然后代碼可能如下所示。

import httplib
import os.path

total_size = os.path.getsize('/path/to/file')
infile = open('/path/to/file')
conn = httplib.HTTPConnection('example.org')
conn.connect()
conn.putrequest('POST', '/upload/')
conn.putheader('Content-Type', 'application/octet-stream')
conn.putheader('Content-Length', str(total_size))
conn.endheaders()
while True:
    chunk = infile.read(1024)
    if not chunk:
        break
    conn.send(chunk)
resp = conn.getresponse()

如果您事先不知道總大小,理論答案就是分塊傳輸編碼 問題是,雖然它被廣泛用於響應,但它似乎不太受歡迎(盡管定義得很好)。 庫存HTTP服務器可能無法開箱即用。 但是,如果服務器也在您的控制之下,您可以嘗試手動解析請求正文中的塊並將它們重新組裝到原始文件中。

另一種選擇是通過同一連接將每個塊作為單獨的請求(具有Content-Length )發送。 但是您仍然需要在服務器上實現自定義邏輯。 而且,您需要在請求之間保持狀態。

添加2012-12-27。 一個nginx模塊可以將分塊請求轉換為常規請求。 只要您不需要真正的流媒體(在客戶端完成發送之前開始處理請求),可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM