讓我開始說,我正在使用twisted.web
框架。的Twisted.web
文件上傳沒有工作,就像我想它(只包括文件數據,而不是任何其他信息),cgi.parse_multipart
不起作用像我希望它(同樣的事情,twisted.web
使用此功能),cgi.FieldStorage
沒有工作(因爲我通過扭曲而不是CGI接口獲取POST數據 - 據我所知,FieldStorage
試圖通過stdin獲取請求),並且twisted.web2
對我不起作用,因爲使用Deferred
困惑和激怒我(對於我想要的太複雜)。我正確解析這個HTTP POST請求嗎?
話雖這麼說,我決定嘗試,只是解析HTTP請求自己。
使用Chrome,HTTP請求也是這樣形成:
------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="upload_file_nonce"
11b03b61-9252-11df-a357-00266c608adb
------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="file"; filename="login.html"
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
...
------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="file"; filename=""
------WebKitFormBoundary7fouZ8mEjlCe92pq--
這是始終將如何形成的呢? (原諒代碼牆):
(注意,我剔除了大部分代碼,只顯示了我認爲相關的東西(正則表達式(是的,嵌套的括號) ),這是一個__init__
方法(唯一的方法至今)在Uploads
I類建造的。完整的代碼可以在修訂歷史記錄中可以看出(我希望我沒有任何錯配括號)
if line == "--{0}--".format(boundary):
finished = True
if in_header == True and not line:
in_header = False
if 'type' not in current_file:
ignore_current_file = True
if in_header == True:
m = re.match(
"Content-Disposition: form-data; name=\"(.*?)\"; filename=\"(.*?)\"$", line)
if m:
input_name, current_file['filename'] = m.group(1), m.group(2)
m = re.match("Content-Type: (.*)$", line)
if m:
current_file['type'] = m.group(1)
else:
if 'data' not in current_file:
current_file['data'] = line
else:
current_file['data'] += line
你可以看到,我開始一個新的「文件」字典每當到達的邊界。我設置in_header
到True
說我解析頭。當我到了一個空行,我切換到False
- 但在檢查是否爲該表單值設置了Content-Type
之前沒有 - 如果沒有,我設置了ignore_current_file
,因爲我只查找文件上傳。
我知道我應該使用一個圖書館,但我生病閱讀文檔的死亡,試圖讓不同的解決方案,在我的項目工作,仍然有代碼看起來合理。我只想通過這個部分 - 而且如果解析帶有文件上傳的HTTP POST這很簡單,那麼我會堅持下去。
注:該代碼完全適用於現在,我只是想知道它是否會嗆/從某些瀏覽器吐出的請求。
遞延實際上是要走的路,因爲這是異步的魔法是如何發生的。 – pcurry 2017-05-18 19:50:36