對于客戶端
文件的上傳其實也是post方式進(jìn)行提交的,可以理解為跟表單提交大體一致佑力,但:
1式散、普通表單采用的是默認(rèn)MIME編碼。默認(rèn)值為:application/x-www-form-urlencoded(在發(fā)送前編碼所有字符)打颤;
2暴拄、文件上傳的表單采用的MIME編碼方式必須指定為:multipart/form-data(不對字符編碼。在使用包含文件上傳控件的表單時编饺,必須使用該值乖篷。);
3透且、在HTML表單里通過設(shè)置:encType來指定MIME編碼撕蔼;比如:encType="multipart/form-data",在其他客戶端采用Content-Type來指定秽誊;比如:Content-Type="multipart/form-data"
說明:一個HTTP請求其實發(fā)送了2大部分內(nèi)容鲸沮,大家常見的就是Request Payload,但是另一個大家不常操作的是Requst Header锅论,簡單來說就是:header+body的方式讼溺。上面的MIME編碼等指定方式就是在header里。當(dāng)然最易,HTML那個encType就是Content-Type怒坯,只是他換了個名字而已炫狱。當(dāng)然,Content-Type何止這2種剔猿。毕荐。。太多了艳馒,詳見
4憎亚、文件上傳還需要一個boundary。
說明:這個是用來干嘛的弄慰?先說位置第美,它是放在Content-Type里。例子:Content-Type="multipart/form-data;boundary=ed67c97e-2000-47de-9033-77aeb8df43d9"(瀏覽器每次都會自動生成一個不同的boundary)陆爽。我們再來看看這玩意兒是用來干嘛的:它標(biāo)志著一段數(shù)據(jù)(當(dāng)有多個上傳內(nèi)容時)的開始和結(jié)束什往。看完了這句話我估計你跟我一樣----毛意思慌闭?别威??驴剔?
a)這一串字符其實就是隨機(jī)生成的省古,它是一個分隔符,一定要確保你需要上傳的文件中沒有完全包含這個分隔符丧失,一般來說豺妓,隨便一個含幾個字符的字符串都是沒有問題的。
b)這個分割符到底是用來分割啥的布讹?它用來分割你表單里各個表單元素琳拭。比如你的表單里有<input type='text' name='username' value="parcool">
<input type='file' name='filename' value="filedata">
就是用來分割這個的。
當(dāng)然描验,Header也不止這點兒東西啊白嘁,還有一些其他的,詳見(維基百科的膘流,不知道你能否打開)
這樣絮缅,你就能愉快的上傳咯,在做安卓或iOS的時候睡扬,很多框架已有類似于瀏覽器的功能會自動加上boundary盟蚣。當(dāng)然,我這里沒有詳細(xì)示例,也沒有最底層的HTTP協(xié)議講解翘悉,只是圖方便理解而已啤挎。
關(guān)于服務(wù)端
寫博文好累的,有空了再寫這邊的吧卷拘,不過意思跟客戶端的幾乎一致氢橙。