摘要:在的中會(huì)使用到,因?yàn)檎?qǐng)求提交了很多類型的數(shù)據(jù),所以必須使用進(jìn)行間隔,也就是所謂的時(shí)的格式。詳細(xì)的的格式在的文檔中有詳細(xì)的介紹。這里貼一張截獲的包的信息,來(lái)幫助大家理解一下這段代碼的原理。通過(guò)提交一份文件和一個(gè)名為的字符串。
?這段時(shí)間本人在學(xué)習(xí)Android Service相關(guān)的內(nèi)容,臨時(shí)需要一個(gè)可以提供文件上傳和下載功能的服務(wù)器,于是上網(wǎng)查找了一個(gè)簡(jiǎn)單服務(wù)器的python實(shí)現(xiàn)代碼,本著溫顧一下HTTP協(xié)議的想法,于是深入研究了一下其中的代碼,發(fā)現(xiàn)大家對(duì)SimpleHTTPRequestsHandler中的self.headers.plisttext.split("=")[1]語(yǔ)句的含義不是很理解,于是自己查閱了一下python源碼定義和相關(guān)HTTP協(xié)議文檔,理解了這段代碼的含義。
源碼定義?我們先來(lái)看一下關(guān)于plisttext的源碼定義。
#https://svn.python.org/projects/python/branches/alpha100/Lib/mimetools.py class Message(rfc822.Message): def __init__(self, fp): .... self.typeheader = self.getheader("content-type") .... def parsetype(self): str = self.typeheader if str == None: str = "text/plain" if ";" in str: i = string.index(str, ";") self.plisttext = str[i:] str = str[:i] else: self.plisttext = "" ....
?從源碼中可以得出,plisttext與HTTP頭部content-type有關(guān),這里我們就要回想一下content-type的有關(guān)定義了。
?在w3c的文檔給出了content-type的格式定義,我們可以發(fā)現(xiàn),content-type對(duì)的值有可選的內(nèi)容,使用;隔開(kāi),所以plisttext的值就是parameter的內(nèi)容。
Content-Type := type "/" subtype *[";" parameter] type := "application" / "audio" / "image" / "message" / "multipart" / "text" / "video" / x-token x-token :=使用原理subtype := token parameter := attribute "=" value attribute := token value := token / quoted-string token := 1* tspecials := "(" / ")" / "<" / ">" / "@" ; Must be in / "," / ";" / ":" / "" / <"> ; quoted-string, / "/" / "[" / "]" / "?" / "." ; to use within / "=" ; parameter values
?知道了plisttext代表的含義,我們?cè)賮?lái)看一下它在文件上傳過(guò)程中的作用吧。我們先來(lái)看一下它在處理文件上傳的post請(qǐng)求時(shí)的作用吧。
boundary = self.headers.plisttext.split("=")[1] remainbytes = int(self.headers["content-length"]) line = self.rfile.readline() remainbytes -= len(line) if not boundary in line: return (False,"Content NOT begin with boundary") line = self.rfile.readline() remainbytes -= len(line) filename = re.findall(r"Content-Disposition.*name="file"; filename="(.*)"",line) if not fn: return (False,"Can"t find out file name")
?我們都知道當(dāng)通過(guò)html的form來(lái)進(jìn)行文件提交時(shí),瀏覽器會(huì)發(fā)送POST請(qǐng)求,并且content-type為multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka,所以,plisttext的值為boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka。boundary在HTTP的body中會(huì)使用到,因?yàn)閜ost請(qǐng)求提交了很多類型的數(shù)據(jù),所以必須使用boundary進(jìn)行間隔,也就是所謂的Multipart Content-Type時(shí)的body格式。詳細(xì)的body的格式在w3c的文檔中有詳細(xì)的介紹。
?這里貼一張wireShark截獲的tcp包的信息,來(lái)幫助大家理解一下這段python代碼的原理。通過(guò)form提交一份文件和一個(gè)名為other的字符串。
POST / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 269353 Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Origin: http://localhost:8080 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka Referer: http://localhost:8080/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="file"; filename="AndroidStudy.png" Content-Type: image/png ..... //圖片內(nèi)容 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="other" ffffd ------WebKitFormBoundaryqdHXHkzdBEGWWZka--
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37988.html
摘要:京東云是將京東云所有資源的管理能力通過(guò)的方式提供出來(lái),供京東云用戶和合作伙伴使用。是京東云控制臺(tái)的有效補(bǔ)充,方便用戶更靈活的控制自己的云上資源。在開(kāi)始調(diào)用京東云之前,需提前在京東云用戶中心賬戶管理下的管理頁(yè)面申請(qǐng)和密鑰對(duì)簡(jiǎn)稱。 京東云OpenAPI是將京東云所有資源的管理能力通過(guò)API的方式提供出來(lái),供京東云用戶和合作伙伴使用。OpenAPI是京東云控制臺(tái)的有效補(bǔ)充,方便用戶更靈活的控...
摘要:勵(lì)以最少的安裝方式進(jìn)行最佳實(shí)踐。上面的例子接收了一個(gè)對(duì)象并準(zhǔn)備將其序列化。裝飾器會(huì)通過(guò)進(jìn)行轉(zhuǎn)換。從對(duì)象中提取的唯一字段是。是一個(gè)特殊的字段,它接受端點(diǎn)名稱并為響應(yīng)中的端點(diǎn)生成一個(gè)。可以查看項(xiàng)查看完整列表。 大綱 簡(jiǎn)介 安裝 快速入門 一個(gè)最小的 api 例子 資源豐富的路由 端點(diǎn) 參數(shù)解析 數(shù)據(jù)格式化 完整 TODO 應(yīng)用例子 簡(jiǎn)介 Flask-RESTful是一個(gè)Flas...
摘要:淺述集群日常管理維護(hù)中的一些痛點(diǎn)較為龐大的集群規(guī)模及容器數(shù)量維護(hù)管理。同時(shí)為了便于分類管理,避免端口沖突和資源合理利用。測(cè)試環(huán)境維護(hù)管理問(wèn)題。測(cè)試版是基于與的運(yùn)維管理系統(tǒng)。 原文出自【聽(tīng)云技術(shù)博客】:http://blog.tingyun.com/web/a...時(shí)至今日,接觸kubernetes也有一段時(shí)間了,而我們的大部分業(yè)務(wù)也已經(jīng)穩(wěn)定地運(yùn)行在不同規(guī)模的kubernetes集群上,...
摘要:目標(biāo)是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認(rèn)的版本。不同類型的鍵值對(duì)分割符號(hào)分別是。這將會(huì)協(xié)商服務(wù)端和你安裝的支持的最高協(xié)議版本。 博客原文? HTTPie 是一個(gè)命令行 HTTP 客戶端。目標(biāo)是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個(gè)簡(jiǎn)單的 http 命令,可以讓我們用簡(jiǎn)單自然的表述發(fā)送任意 HTTP 請(qǐng)求,并且可以輸出帶代碼高亮的結(jié)果...
摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)部署相關(guān)庫(kù)的安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)網(wǎng)頁(yè)基礎(chǔ)在寫(xiě)爬蟲(chóng)之前,還是需要了解一些爬蟲(chóng)的基礎(chǔ)知識(shí),如原理網(wǎng)頁(yè)的基礎(chǔ)知識(shí)爬蟲(chóng)的基本原理基本原理等。由萬(wàn)維網(wǎng)協(xié)會(huì)和工作小組共同合作制定的規(guī)范,目前廣泛使用的是版本。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---14、部署相關(guān)庫(kù)的安裝:Scrapyrt、Gerapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---16、Web網(wǎng)頁(yè)基礎(chǔ)...
閱讀 2411·2021-11-16 11:44
閱讀 848·2021-09-10 11:16
閱讀 2224·2019-08-30 15:54
閱讀 1042·2019-08-30 15:53
閱讀 1894·2019-08-30 13:00
閱讀 615·2019-08-29 17:07
閱讀 3509·2019-08-29 16:39
閱讀 3135·2019-08-29 13:30