1樓:三熙
首先要說一句公認的廢話,怎麼處理是伺服器做的事兒,http協議本身並沒有死規定,以下說的只是解決問題的某一種思路。有乙個基本認識是,每乙個請求都是乙個流。而每乙個用於傳輸檔案的http報文,都會有類似於這樣巧閉的報頭:
content-type: multipart/form-data; boundary=巴拉巴拉如果報頭定義了這樣的東西,就可以判斷客戶端採用了multipart格式傳遞資訊,同時我們也拿到了boundray。再考慮檔案如何處理。
以問題中提到的報文為例,payload第一次讀到定義的邊界意味著乙個欄位的開始;繼續讀入一行,發現這是個檔案;再讀入一行,發現定義了content-type,也許還會定義charset之類的資訊;再讀入一行發現是個 crlf ,意味著後續的茄寬神內容是檔案資料,這時候可以構造乙個新的臨時檔案物件,將後續的資料pipe到這個臨時檔案物件中再一次讀到邊界意味著這乙個欄位結束,這時候可以去關閉剛剛建立的臨時檔案。 然後開始繼續下一欄位解析過程。以上部分只是簡單的說了解決思路,並不涉及檢查、轉換等工作。
比如在流的pipe過程中,可能需要根據之前定義的charset進行流的轉換,甚至如果發現content-type不是自己需要的,就壓根不存而是直接pipe到黑洞中去。檔案顫虧就是磁碟上的一段空間,檔案的內容就是一串2進位數字(1或者0)。檔案傳輸,就是把這串數字通過http協議傳過去。
伺服器端,接到這段資料之後,按照協議規定的格式,把這串數字取出來,然後建立乙個空檔案(分配一段空間),然後把這段數字寫進去,就成了乙個跟上傳檔案完全一致的新檔案。
2樓:阿qi棄
一般,我們用流的形式來處理一串二進位資料,body可以看作是乙個流,或者傳過來的某個隱和檔案封裝成乙個流。我們拿到body後,就可以還原成表單資料。先用boundary分割,然後按照固定格式又去拆解,都是在灶備盯字元層面上處理的,處理完成後,按照對應的名字附加到request物件上,如果是檔案二進位資料,就滾蔽會封裝為乙個流拿給你隨便折騰。
你看到,還有content-disposition: form-data; name="hehe" 在body中,表明了這一串字元代表的是什麼東西。具體的解析過程我不清楚,也就大概那麼回事兒,步驟上要更明智一些,比如我猜測讀取body的流可能不是分割的,而是從頭到尾讀取字元,遇到boundary再分割。
3樓:鑫晨旅真
你要明白,http傳輸的都是二進位資料,我們可以看成傳輸的都是字元。這個你能理解嗎?接下來把http請求分解成header和body部分,header就是請求方法,url,協議版本,content-length等等,然後是兩仿巖個作為header和body分割。
body部分就是你看到的,一般也稱為payload。對於body中的不同東西,我們怎麼分割呢?比如你傳多個檔案?
類似於,body中傳輸的東西都用header中的boundary來分割的,40個字元。這樣,body中傳輸的東西都被序列化成字元(二進位)資料傳輸過去了。我之前用xhr上傳檔案,在header中備凳御自定了boundary,結果和body中的分割符不對等,後臺獲取的檔案流始粗好終沒有,google了許久。
全國多地拉閘限電,背後到底發生了什麼呢?
家裡突然斷電,還以為沒有電費了,看了段賣隱餘額電費,還有好多打 問了物業,原來是因為國家限制用電,被強制拉閘了!最開始被限制用電的地區是在東北,現在,湖南,廣東,江蘇地區也開始出現了限電現象,不少地方不僅限電還限水,這讓平常用電無度的我們如何適應?發電的方式不是很多嗎?我還以為我們國家的電取之不盡,...
為什麼ftp上傳不了檔案,為什麼FTP上傳的時候有的檔案不能上傳?
檢查你的伺服器埠,使用者名稱,密碼的設定!望採納!尤其是伺服器埠!具體什麼錯誤資訊麻煩描述詳細一點謝謝 為什麼ftp上傳的時候有的檔案不能上傳?你試著把檔案型別重新命名,再上傳,上傳成功後,再改回。如果不行就是這個使用者許可權不夠。有些檔案的型別是被伺服器過濾掉的,比如說可執行檔案等等.所以不能上傳...
99年發生了什麼?網上傳的很火啊誰知道
1999年初,一顆隕石襲擊了地球,隨後外星人入侵我太陽系第三行星體地球行動正式開始,近一個月時間內,位於木衛2,冥王星的兩處空天防禦基地被毀滅,其中在冥王星一役中對方使用了陽離子電極炮,蒸發了9 的地表質量。並在其表面殘留了大量的挪威夫斯基粒子。1999年2月21日,外星人通過遠距離集束式散合炮轟擊...