成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

網(wǎng)頁上傳文件的原理詳解

chengjianhua / 1052人閱讀

摘要:再深入想一想,如果不使用這些庫,怎么上傳文件可能會難倒很多人,所以這篇文章簡單講講文件上傳的原理,其實就是根據(jù)協(xié)議的定義,封裝一個消息體。

今年第三季度工作上完成了一個比較有意思的項目,類似于外包的性質(zhì),主要任務(wù)就是提供一大堆API,其中一個API是上傳附件,完成開發(fā)后,對方的程序員問我,這個API怎么調(diào)用,當(dāng)時我就愣住了,因為自己也沒想過這個問題,一般情況下,我就是用 Curl 命令行或 Postman 測試API的。

針對文件上傳,我使用 Curl 測試,比如:

# 使用@引用一個文件
$ curl -F"param=value" -F"file=@/path/file.png" http://localhost/api.php
如果使用Postman測試,如下圖:

注意觀察form-data和File標簽。

看上去是不是很簡單,現(xiàn)在換個角度,你想以代碼的方式上傳文件API,怎么辦?也非常簡單,很多開發(fā)語言有很多現(xiàn)成的庫,比如PHP通過Curl庫上傳文件非常容易。再深入想一想,如果不使用這些庫,怎么上傳文件?可能會難倒很多人,所以這篇文章簡單講講文件上傳的原理,其實就是根據(jù)HTTP協(xié)議的定義,封裝一個HTTP消息體。

MIME

首先必須先講下MIME(Multipurpose Internet Mail Extensions),它并不是HTTP協(xié)議的一部分,就像我們每個人都是獨一無二的,有自己的屬性,互聯(lián)網(wǎng)上每個資源也有屬性,比如有些資源是圖片,有些是視頻,有些是HTML頁面,MIME規(guī)定了每種資源的類型,這個類型不是隨便定義的,由IANA負責(zé)登記和維護。

說的有點難理解,比如你看到一個URL地址,http://localhost/image.png,我們其實并不是通過.png后綴判斷資源類型的,而是通過MIME來獲知該資源類型的,這個圖片的MIME可能就是image/png(至于客戶端如何知曉資源的MIME類型,后面會講),現(xiàn)在是不是有了點感性的認識了。

MIME類型結(jié)構(gòu)如下:

type/subtype

type相當(dāng)于某些類型的集合,而subtype相當(dāng)于子類型。以image/png為例,image表示圖片類型集合,png表示某種類型圖片。

讓我們看幾個比較重要的MIME類型:

text/plain
text/html
application/octet-stream
multipart/form-data

其實本篇文章的主角就是multipart/form-data,再等一等,先別著急,再一次說說MIME,從它的英文全稱來看,它和mail有關(guān)系,是由mail應(yīng)用定義而來的,一封郵件由多種資源組成,為了將不同類型的資源組成在郵件中,MIME產(chǎn)生了。隨著互聯(lián)網(wǎng)Web的發(fā)展,MIME的作用越來越多,擴展也越來越多,MIME概念也逐步移到了Web。

Content Type

現(xiàn)在我們定義了每種資源的MIME類型,那么客戶端如何知曉每種資源的MIME類型呢?這時候就要使用Content-Type HTTP Header 頭了,比如我們請求一個資源,Web服務(wù)器在發(fā)送資源的時候,發(fā)送了“content-type:image/png” Header 頭,這樣客戶端就知道該資源是一個png圖片了。

如果客戶端發(fā)送了一個 “Content-Type: multipart/form-data;”,代表客戶端要上傳一個附件。

也就是說 Content-Type 后面的值就是一個 MIME 類型,聰明的同學(xué)也猜到了,上傳附件和 multipart/form-data MIME 類型有關(guān),確實是!

multipart/form-data

multipart/form-data 這個MIME類型并不是標準的MIME類型,而是因為Web的需要擴展而來的,我們在開發(fā)網(wǎng)頁的時候為了上傳一個文件,會輸入以下的HTML標簽:

Select image to upload:

關(guān)于HTML表單上傳可以參考 https://www.w3.org/TR/html5/s... 或 RFC 1867(Form-based File Upload in HTML,該RFC已經(jīng)廢棄了)。

那么multipart/form-data表示什么呢?multipart互聯(lián)網(wǎng)上的混合資源,就是資源由多種元素組成,form-data表示可以使用HTML Forms 和 POST 方法上傳文件,具體的定義可以參考RFC 7578。

multipart/form-data結(jié)構(gòu)

說了那么多,從HTTP協(xié)議的角度,最后看下文件上傳的HTTP消息體,使用Postman也容易看出,如下:

POST /api.php HTTP/1.1
Host: localhst
Cache-Control: no-cache
Content-Type: multipart/form-data; boundary=----FormBoundary

------FormBoundary
Content-Disposition: form-data; name="file"; filename="file.png"
Content-Type: image/png

<圖片二進制內(nèi)容>
------FormBoundary
Content-Disposition: form-data; name="param1"

value1
------FormBoundary
Content-Disposition: form-data; name="param2"

value2
------FormBoundary--

消息體什么意思呢,如果你自行想使用代碼實現(xiàn)文件上傳,要根據(jù)定義自行封裝HTTP消息,接下去我們簡單描述一下。

Content-Type: multipart/form-data; boundary=——FormBoundary 表示要上傳附件,其中boundary表示分隔符,如果要上傳多個表單項,就要使用boundary分割,每個表單項由———FormBoundary開始,以———FormBoundary結(jié)尾。每一個表單項又由Content-Type和Content-Disposition組成。

------FormBoundary
Content-Disposition: form-data; name="param1"

value1
------FormBoundary

表示普通的一個表單元素,最重要的是理解 Content-Disposition HTTP 消息頭,其中第一個參數(shù)總是固定不變的form-data,name表示表單元素屬性名,回車換行符后面的內(nèi)容就是元素的值。

接下去重點描述和文件有關(guān)的:

------FormBoundary
Content-Disposition: form-data; name="file"; filename="file.png"
Content-Type: image/png

<圖片二進制內(nèi)容>
------FormBoundary
其中多了一個filename參數(shù),表示文件名,Content-Type 告訴服務(wù)器這是一個圖片,內(nèi)容就是圖片的二進制數(shù)據(jù)。

其實Content-Disposition這個HTTP header頭用途也很廣泛,在本文就不重點描述了。

其實要自行封裝文件上傳,最好的辦法就是用自己熟悉的開發(fā)語言實現(xiàn)一下,這樣印象才更深刻,希望這篇文章對你有用。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/53571.html

相關(guān)文章

  • antd 和 element上傳文件詳解與FormData詳解

    摘要:當(dāng)用戶完成選擇文件動作時,提交子頁面中的。從此我們上傳文件就歡欣鼓舞的來找了。因為的核心是對象,異步的實現(xiàn)是通過一個對象,一般簡稱該對象對。這些回答基于自己理解,如有不妥,希望路過的大神輕噴,指正。 背景 平時工作中經(jīng)常會遇到需要上傳文件的情況,如果你用ant design 或者element ,它們都提供了上傳的組件。 我們分別來看一下element 和 antd 手動上傳怎么處理:...

    Fundebug 評論0 收藏0
  • 2017文章總結(jié)

    摘要:歡迎來我的個人站點性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進階鵝廠大神用直出實現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優(yōu)化動 歡迎來我的個人站點 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...

    dailybird 評論0 收藏0
  • 2017文章總結(jié)

    摘要:歡迎來我的個人站點性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進階鵝廠大神用直出實現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優(yōu)化動 歡迎來我的個人站點 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...

    hellowoody 評論0 收藏0
  • 2017文章總結(jié)

    摘要:歡迎來我的個人站點性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進階鵝廠大神用直出實現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優(yōu)化動 歡迎來我的個人站點 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...

    wwolf 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<