转:vc中如何通过http的post方式上传文件
文章引自:http://blog.myspace.cn/e/404248359.htm
vc中如何通過http的post方式上傳文件
HTTP響應(yīng) ?
? 在接收和解釋請求消息后,服務(wù)器會(huì)返回一個(gè)HTTP響應(yīng)消息。 ?
? ?
? 與HTTP請求類似,HTTP響應(yīng)也是三個(gè)部分組成,分別是: ?
? 狀態(tài)行、消息報(bào)頭、響應(yīng)正文。 ?
? ?
? 狀態(tài)行: ?
? 狀態(tài)行由協(xié)議版本、數(shù)字形式的狀態(tài)代碼、及相應(yīng)的狀態(tài)描述,各元素之間以空格分隔。 ?
? ?
? 格式: ? ? ? HTTP-Version ? Status-Code ? Reason-Phrase ? CRLF ?
? ?
? 例如: ? ? ? HTTP/1.1 ? 200 ? OK ? \r\n ?
? ?
? 狀態(tài)代碼: ?
? 狀態(tài)代碼由3位數(shù)字組成,表示請求是否被理解或被滿足。 ?
? ?
? 狀態(tài)描述: ?
? 狀態(tài)描述給出了關(guān)于狀態(tài)代碼的簡短的文字描述。 ?
? ?
? 狀態(tài)代碼的第一個(gè)數(shù)字定義了響應(yīng)的類別,后面兩位沒有具體的分類。 ?
? 第一個(gè)數(shù)字有五種可能的取值: ?
? - ? 1xx: ? ? 指示信息—表示請求已接收,繼續(xù)處理。 ?
? - ? 2xx: ? ? 成功—表示請求已經(jīng)被成功接收、理解、接受。 ?
? - ? 3xx: ? ? 重定向—要完成請求必須進(jìn)行更進(jìn)一步的操作。 ?
? - ? 4xx: ? ? 客戶端錯(cuò)誤—請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)。 ?
? - ? 5xx: 服務(wù)器端錯(cuò)誤—服務(wù)器未能實(shí)現(xiàn)合法的請求。 ?
? ?
? ?
? 狀態(tài)代碼 狀態(tài)描述 說明 ?
? ? ? 200 ? ? ? OK 客戶端請求成功 ?
? ? ? 400 ? ? ? ? ? ? ? Bad ? Request 由于客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解。 ?
? ? ? 401 ? ? ? ? ? ? ? Unauthonzed 請求未經(jīng)授權(quán)。這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用 ?
? ? ? 403 Forbidden 服務(wù)器收到請求,但是拒絕提供服務(wù)。服務(wù)器通常會(huì)在響應(yīng)正文中給出不提供服務(wù)的原因 ?
? ? ? 404 Not ? Found 請求的資源不存在,例如,輸入了錯(cuò)誤的URL。 ?
? ? ? 500 ? ? ? Internal ? Server ? Error 服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤,導(dǎo)致無法完成客戶端的請求。 ?
? ? ? 503 ? ? ? ? Service ? Unavailable 服務(wù)器當(dāng)前不能夠處理客戶端的請求,在一段時(shí)間之后,服務(wù)器可能會(huì)恢復(fù)正常。
HTTP消息 ?
? HTTP消息由客戶端到服務(wù)器的請求和服務(wù)器到客戶端的響應(yīng)組成。請求消息和響應(yīng)消息都是由開始行,消息報(bào)頭(可選的),空行(只有CTLF的行),消息正文(可選的)組成。 ?
? 對于請求消息,開始行就是請求行。 ?
? 對于響應(yīng)消息,開始行就是狀態(tài)行。 ?
? ?
? ?
? 消息報(bào)頭 ?
? HTTP消息報(bào)頭包括普通報(bào)頭、請求報(bào)頭、響應(yīng)報(bào)頭、實(shí)體報(bào)頭。 ?
? 每一個(gè)報(bào)頭域都是由(名字+":"+空格+值)組成,消息報(bào)頭域的名字是大小寫無關(guān)的。 ?
? ?
? ?
? ?
? 普通報(bào)頭: ?
? 在普通報(bào)頭中,有少數(shù)報(bào)頭域應(yīng)用于所有的請求和響應(yīng)消息,但并不用于被傳輸?shù)膶?shí)體,這些報(bào)頭域只用于傳輸?shù)南ⅰ??
? 常用的普通報(bào)頭域:Cache-Control,Date,Connection,Pragma. ?
? ?
? ?
? ?
? 請求報(bào)頭: ?
? 請求報(bào)頭允許客戶端向服務(wù)器端傳遞該請求的附加信息以及客戶端自身的信息。 ?
? 常用的請求報(bào)頭域: ?
? Accept ?
? ? ? ? Accept請求報(bào)頭域用語指定客戶端接受哪些類型的信息。例如:Accept: ? image/gif,表明客戶端希望接受GIF圖象格式的資源;Accept: ? text/html,表明客戶端希望接受html文本。 ?
? Accept-Charset ?
? ? ? ? Accept-Charset請求報(bào)頭域用于指定客戶端接受的字符集。例如:Accept-Charset: ? ios-8859-1,gb2312。如果在請求消息中沒有設(shè)置這個(gè)域,缺省是任何字符集都可以接受。 ?
? Accept-Encoding ?
? ? ? ? Accept-Encoding請求報(bào)頭域類似Accept,但是它是用于指定可接受的內(nèi)容編碼。例如:Accept-Encoding: ? gzip,deflate。如果請求消息中沒有設(shè)置這個(gè)域,服務(wù)器假定客戶端對各種內(nèi)容編碼都可接受。 ?
? Accept-Language ?
? ? ? ? Accept-Language請求報(bào)頭域類似于Accept,但是它是用于指定一種自然語言。例如:Accept-Language: ? zh-cn。如果請求消息中沒有設(shè)置這個(gè)域,服務(wù)器假定客戶端對各種語言都可接受。 ?
? Authorization ?
? ? ? ? Authorization請求報(bào)頭域主要用于證明客戶端有權(quán)查看某個(gè)資源。當(dāng)瀏覽器訪問一個(gè)頁面時(shí),如果收到服務(wù)器的響應(yīng)代碼為401(未授權(quán)),可以發(fā)送一個(gè)包含Authorization請求報(bào)頭域的請求,要服務(wù)器對其進(jìn)行驗(yàn)證。 ?
? Host ?
? ? ? ? Host請求報(bào)頭域主要用于指定被請求資源的Internet主機(jī)和端口號,它通常是從HTTP ? URL中提取出來的。 ?
? 例如:http://www.sunxin.org/index.html。瀏覽器發(fā)送的請求消息中,就會(huì)包含Host請求報(bào)頭域,如下:Host: ? www.sunxin.org ?
? 后面沒有跟端口號,表明使用的是缺省端口號80,如果端口號不是80,那么就要在主機(jī)名后面加上一個(gè)冒號(":"),然后接上端口號,例如: ?
? Host: ? www.sunxin.org:8080。 ? ? 要注意的是,在發(fā)送HTTP請求的時(shí)候,這個(gè)報(bào)頭域是必須的。 ?
? User-Agent ?
? ? ? ? User-Agent允許客戶端將它的操作系統(tǒng)瀏覽器和其他屬性告訴服務(wù)器。我們上網(wǎng)登陸論壇的時(shí)候,往往看到些歡迎信息,其中列出了你的操作系統(tǒng)的名稱和版本等等信息。原因是:服務(wù)器從User-Agent請求報(bào)頭域中獲取的這些信息,自己編寫瀏覽器可以不用這個(gè)請求報(bào)頭域。服務(wù)器就無法得知了。
由于帖子不能連續(xù)發(fā)送3次以上,所以我又申請了個(gè)號過來繼續(xù)發(fā),要是給分,就只給在wf520pb上啊,呵呵。。。 ?
? ?
? -------------------------------------------------- ?
? 響應(yīng)報(bào)頭 ?
? 響應(yīng)報(bào)頭允許服務(wù)器傳遞不能放在狀態(tài)行中的附加響應(yīng)信息,以及關(guān)于服務(wù)器的信息和對Request-URI所標(biāo)識的資源進(jìn)行下一步訪問的信息。 ?
? 常用的響應(yīng)報(bào)頭域: ?
? Location ?
? ? ? ? Location響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置。例如:客戶端所請求的頁面已不存在原先的位置,為了讓客戶端重定向到這個(gè)頁面新的位置,服務(wù)器端可以發(fā)回Location響應(yīng)報(bào)頭后使用重定向語句,讓客戶端去訪問新的域名所對應(yīng)的服務(wù)器上的資源。當(dāng)我們在JSP中使用重定向語句的時(shí)候,服務(wù)器端向客戶端發(fā)回的響應(yīng)報(bào)頭中,就會(huì)有Location響應(yīng)報(bào)頭域。下面是Location響應(yīng)報(bào)頭域的一個(gè)例子:Location: ? http://www.sunxin.org ?
? Server ?
? ? ? ? Server響應(yīng)報(bào)頭域包含了服務(wù)器用來處理請求的軟件信息。它和User-Agent請求報(bào)頭域是相對應(yīng)的,前者發(fā)送服務(wù)器端軟件的信息,后者發(fā)送客戶端軟件(瀏覽器)和操作系統(tǒng)的信息。下面是Server響應(yīng)報(bào)頭域的一個(gè)例子:Server: ? Apache-Coyote/1.1 ?
? WWW-Authenticate ?
? ? ? ? WWW-Authenticate響應(yīng)報(bào)頭域必須被包含在401(未授權(quán)的)響應(yīng)消息中,這個(gè)報(bào)頭域和前面講到的Authorization請求報(bào)頭域是相關(guān)的,當(dāng)客戶端收到401響應(yīng)消息,就要決定是否請求服務(wù)器對其進(jìn)行驗(yàn)證。如果要求服務(wù)器對其進(jìn)行驗(yàn)證,就可以發(fā)送一個(gè)包含了Authorization報(bào)頭域的請求,下面是WWW-Authenticate響應(yīng)報(bào)頭域的一個(gè)例子:WWW-Authenticate: ? Basic ? realm="Basic ? Auth ? Test!" ?
? 從這個(gè)響應(yīng)報(bào)頭域,可以知道服務(wù)器端對我們所請求的資源采用的是基本驗(yàn)證機(jī)制。
實(shí)體報(bào)頭 ?
? 請求和響應(yīng)消息都可以傳送一個(gè)實(shí)體。一個(gè)實(shí)體由實(shí)體報(bào)頭域和實(shí)體正文組成,大多數(shù)情況下,實(shí)體正文就是請求消息中的請求正文或者響應(yīng)消息中的響應(yīng)正文。但是在發(fā)送時(shí),并不是說實(shí)體報(bào)頭域和實(shí)體正文要在一起發(fā)送,例如:有些響應(yīng)可以只包含實(shí)體報(bào)頭域。實(shí)體就好象我們寫的書信,在信中,我們可以寫上標(biāo)題,加上頁號等,這部分就相當(dāng)于是實(shí)體報(bào)頭域,而我們所寫的書信的內(nèi)容,就相當(dāng)于實(shí)體正文。前面說講的普通報(bào)頭、請求報(bào)頭、響應(yīng)報(bào)頭我們可以看成是寫在信封上的郵編、接收者,發(fā)送者等內(nèi)容。 ?
? 實(shí)體報(bào)頭定義了關(guān)于實(shí)體正文(例如:有無實(shí)體正文)和請求所標(biāo)識的資源的元信息。 ?
? 所謂元信息,是指描述其他信息的信息。 ?
? ?
? 常用的實(shí)體報(bào)頭域: ?
? Content-Encoding ?
? ? ? ? ? Content-Encoding實(shí)體報(bào)頭域被使用作媒體類型的修飾符,它的值指示了已經(jīng)被應(yīng)用到實(shí)體正文的附加內(nèi)容編碼,因而要獲得Content-Type報(bào)頭域中所引用的媒體類型,必須采用相應(yīng)的解碼機(jī)制。Content-Encoding主要用語記錄文檔的壓縮方法,下面是它的一個(gè)例子:Content-Encoding: ? gzip。如果一個(gè)實(shí)體正文采用了編碼方式存儲(chǔ),在使用之前就必須進(jìn)行解碼。 ?
? Content-Language ?
? ? ? ? ? Content-Language實(shí)體報(bào)頭域描述了資源所用的自然語言。Content-Language允許用戶遵照自身的首選語言來識別和區(qū)分實(shí)體。如果這個(gè)實(shí)體內(nèi)容僅僅打算提供給丹麥的閱讀者,那么可以按照如下的方式設(shè)置這個(gè)實(shí)體報(bào)頭域:Content-Language: ? da。 ?
? 如果沒有指定Content-Language報(bào)頭域,那么實(shí)體內(nèi)容將提供給所以語言的閱讀者。 ?
? Content-Length ?
? ? ? ? ? Content-Length實(shí)體報(bào)頭域用于指明正文的長度,以字節(jié)方式存儲(chǔ)的十進(jìn)制數(shù)字來表示,也就是一個(gè)數(shù)字字符占一個(gè)字節(jié),用其對應(yīng)的ASCII碼存儲(chǔ)傳輸。 ?
? ? ? ? ? 要注意的是:這個(gè)長度僅僅是表示實(shí)體正文的長度,沒有包括實(shí)體報(bào)頭的長度。 ?
? Content-Type ?
? ? ? ? ? Content-Type實(shí)體報(bào)頭域用語指明發(fā)送給接收者的實(shí)體正文的媒體類型。例如: ?
? Content-Type: ? text/html;charset=ISO-8859-1 ?
? Content-Type: ? text/html;charset=GB2312 ?
? Last-Modified ?
? ? ? ? ? Last-Modified實(shí)體報(bào)頭域用于指示資源最后的修改日期及時(shí)間。 ?
? Expires ?
? ? ? ? ? Expires實(shí)體報(bào)頭域給出響應(yīng)過期的日期和時(shí)間。通常,代理服務(wù)器或?yàn)g覽器會(huì)緩存一些頁面。當(dāng)用戶再次訪問這些頁面時(shí),直接從緩存中加載并顯示給用戶,這樣縮短了響應(yīng)的時(shí)間,減少服務(wù)器的負(fù)載。為了讓代理服務(wù)器或?yàn)g覽器在一段時(shí)間后更新頁面,我們可以使用Expires實(shí)體報(bào)頭域指定頁面過期的時(shí)間。當(dāng)用戶又一次訪問頁面時(shí),如果Expires報(bào)頭域給出的日期和時(shí)間比Date普通報(bào)頭域給出的日期和時(shí)間要早(或相同),那么代理服務(wù)器或?yàn)g覽器就不會(huì)再使用緩存的頁面而是從服務(wù)器上請求更新的頁面。不過要注意,即使頁面過期了,也并不意味著服務(wù)器上的原始資源在此時(shí)間之前或之后發(fā)生了改變。 ?
? ? ? ? ? Expires實(shí)體報(bào)頭域使用的日期和時(shí)間必須是RFC ? 1123中的日期格式,例如: ?
? Expires: ? Thu, ? 15 ? Sep ? 2005 ? 16:00:00 ? GMT ?
? ? ? ? ? HTTP1.1的客戶端和緩存必須將其他非法的日期格式(也包括0)看作已過期。例如,為了讓瀏覽器不要緩存頁面,我們也可以利用Expires實(shí)體報(bào)頭域,設(shè)置它的值為0,如下(JSP):response.setDateHeader("Expires",0);
?
除掉注釋的部分就是一個(gè)完整的包,向/user/tmpUpload.php上傳了一個(gè)文件。 ?
? =========http頭========== ?
? POST ? /user/tmpUpload.php ? HTTP/1.1 ?
? Content-Type: ? multipart/form-data; ? boundary=---------------------------7d53b9297030e ?
? Content-Length: ? 1017 ?
? ?
? -----------------------------7d53b9297030e ?
? Content-Disposition: ? form-data; ? name="upload"; ? filename="C:\Documents.and.Settings\hwy\桌面\attachment" ?
? Content-Type: ? p ?
? ?
? 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ?
? -----------------------------7d53b9297030e-- ?
? ? ?
? ? ===========結(jié)束============???
轉(zhuǎn)載于:https://www.cnblogs.com/cumtb3S/archive/2010/05/30/1747497.html
總結(jié)
以上是生活随笔為你收集整理的转:vc中如何通过http的post方式上传文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TrueSec引导的Linux系统和安全
- 下一篇: C++ Vector学习笔记