1. 程式人生 > >[轉載]http以post方式上傳一個檔案,構造其請求頭和訊息報文

[轉載]http以post方式上傳一個檔案,構造其請求頭和訊息報文

  首先客戶端連結 192.168.24.56 後, 應該傳送如下http 請求:

  Accept: text/plain, */* 
  Accept-Language: zh-cn 
  Host: 192.168.24.56
  Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2
  User-Agent: WinHttpClient 
  Content-Length: 3693
  Connection: Keep-Alive

  -------------------------------7db372eb000e2

Content-Disposition: form-data; name="file"; filename="kn.jpg"

  Content-Type: image/jpeg

  (此處省略jpeg檔案二進位制資料...)

-------------------------------7db372eb000e2--

此內容必須一字不差,包括最後的回車,紅色字型部分就是協議的頭。給伺服器上傳資料時,並非協議頭每個欄位都得說明,其中,content-type是必須的,它包括一個類似標誌性質的名為boundary的標誌,它可以是隨便輸入的字串。對後面的具體內容也是必須的。它用來分辨一段內容的開始。

Content-Length: 3693 ,這裡的3693是要上傳檔案的總長度。綠色字型部分就是需要上傳的資料,可以是文字,也可以是圖片等。資料內容前面需要有Content-Disposition, Content-Type以及Content-Transfer-Encoding等說明欄位。最後的紫色部分就是協議的結尾了。

注意這一行:

  Content-Type: multipart/form-data; boundary=---------------------------7db372eb000e2

  根據 rfc1867, multipart/form-data是必須的. 
  ---------------------------

7db372eb000e2 是分隔符,分隔多個檔案、表單項。其中b372eb000e2 是即時生成的一個數字,用以確保整個分隔符不會在檔案或表單項的內容中出現。Form每個部分用分隔符分割,分隔符之前必須加上"--"著兩個字元(即--{boundary})才能被http協議認為是Form的分隔符,表示結束的話用在正確的分隔符後面新增"--"表示結束。

  前面的 ---------------------------7d 是 IE 特有的標誌,Mozila 為---------------------------71. 

  例如Contect-Type:image/jpeg 表示下面的資料是jpeg檔案資料

============================================================================

[轉]通過 http 協議上傳檔案

2008-04-30 23:55
1、概述
在最初的 http 協議中,沒有上傳檔案方面的功能。 rfc1867 ( http://www.ietf.org/rfc/rfc1867.txt ) 為 http 協議添加了這個功能。客戶端的瀏覽器,如 Microsoft IE, Mozila, Opera 等,按照此規範將使用者指定的檔案傳送到伺服器。伺服器端的網頁程式,如 php, asp, jsp 等,可以按照此規範,解析出使用者傳送來的檔案。
Microsoft IE, Mozila, Opera 已經支援此協議,在網頁中使用一個特殊的 form 就可以傳送檔案。
絕大部分 http server ,包括 tomcat ,已經支援此協議,可接受傳送來的檔案。
各種網頁程式,如 php, asp, jsp 中,對於上傳檔案已經做了很好的封裝。 2、上傳檔案的例項:用 servelet 實現(http server 為 tomcat 4.1.24)
1. 在一個 html 網頁中,寫一個如下的form : <form enctype="multipart/form-data" action="http://192.168.29.65/UploadFile" method=post>     load multi files :<br>     <input name="userfile1" type="file"><br>     <input name="userfile2" type="file"><br>     <input name="userfile3" type="file"><br>     <input name="userfile4" type="file"><br>     text field :<input type="text" name="text" value="text"><br>     <input type="submit" value="提交"><input type=reset> </form> 2. 服務端 servelet 的編寫
現在第三方的 http upload file 工具庫很多。Jarkata 專案本身就提供了fileupload 包
http://jakarta.apache.org/commons/fileupload/ 。檔案上傳、表單項處理、效率問題基本上都考慮到了。在 struts 中就使用了這個包,不過是用 struts 的方式另行封裝了一次。這裡我們直接使用 fileupload 包。至於struts 中的用法,請參閱 struts 相關文件。
這個處理檔案上傳的 servelet 主要程式碼如下:
public void doPost( HttpServletRequest request, HttpServletResponse response ) {     DiskFileUpload diskFileUpload = new DiskFileUpload();     // 允許檔案最大長度     diskFileUpload.setSizeMax( 100*1024*1024 );     // 設定記憶體緩衝大小     diskFileUpload.setSizeThreshold( 4096 );     // 設定臨時目錄     diskFileUpload.setRepositoryPath( "c:/tmp" );     List fileItems = diskFileUpload.parseRequest( request );     Iterator iter = fileItems.iterator();     for( ; iter.hasNext(); ) {         FileItem fileItem = (FileItem) iter.next();         if( fileItem.isFormField() ) {             // 當前是一個表單項             out.println( "form field : " + fileItem.getFieldName() + ", " + fileItem.getString() );         } else {             // 當前是一個上傳的檔案             String fileName = fileItem.getName();             fileItem.write( new File("c:/uploads/"+fileName) );         }     } } 為簡略起見,異常處理,檔案重新命名等細節沒有寫出。
3、 客戶端傳送內容構造 假設接受檔案的網頁程式位於 http://192.168.29.65/upload_file/UploadFile.
假設我們要傳送一個二進位制檔案、一個文字框表單項、一個密碼框表單項。檔名為 E:\s ,其內容如下:(其中的XXX代表二進位制資料,如 01 02 03)
a bb XXX ccc 客戶端應該向 192.168.29.65 傳送如下內容: POST /upload_file/UploadFile HTTP/1.1 Accept: text/plain, */* Accept-Language: zh-cn Host: 192.168.29.65:80 Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6 User-Agent: Mozilla/4.0 (compatible; OpenOffice.org) Content-Length: 424 Connection: Keep-Alive -----------------------------7d33a816d302b6 Content-Disposition: form-data; name="userfile1"; filename="E:\s" Content-Type: application/octet-stream a bb XXX ccc -----------------------------7d33a816d302b6 Content-Disposition: form-data; name="text1" foo -----------------------------7d33a816d302b6 Content-Disposition: form-data; name="password1" bar -----------------------------7d33a816d302b6-- 此內容必須一字不差,包括最後的回車。
注意:Content-Length: 424 這裡的424是紅色內容的總長度(包括最後的回車)
注意這一行:
Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6
根據 rfc1867, multipart/form-data是必須的.
---------------------------7d33a816d302b6 是分隔符,分隔多個檔案、表單項。其中33a816d302b6 是即時生成的一個數字,用以確保整個分隔符不會在檔案或表單項的內容中出現。前面的 ---------------------------7d 是 IE 特有的標誌。 Mozila 為---------------------------71
用手工傳送這個例子,在上述的 servlet 中檢驗通過。
(上面有一個回車)使用者可以選擇多個檔案,填寫表單其它項,點選“提交”按鈕後就開始上傳給http://192.168.29.65/upload_file/UploadFile 這是一個 servelet 程式
注意 enctype="multipart/form-data", method=post, type="file" 。根據 rfc1867, 這三個屬性是必須的。multipart/form-data 是新增的編碼型別,以提高二進位制檔案的傳輸效率。具體的解釋請參閱 rfc1867

相關推薦

[轉載]httppost方式一個檔案構造請求訊息報文

  首先客戶端連結 192.168.24.56 後, 應該傳送如下http 請求:   Accept: text/plain, */*   Accept-Language: zh-cn   Host: 192.168.24.56  Content-Type:multipart/form-data;bo

php實現curl請求post方式圖片檔案

在呼叫第三方api介面時,有時會遇到通過http協議上傳圖片,以下是一個微信公眾平臺新增永久素材的例子;php程式碼: /* 使用curl函式 */ $url = "https://api.weixin.qq.com/cgi-bin/material/add_m

linux整理筆記:root使用者檔案其他使用者無法覆蓋刪除

場景: 多人協作一個目錄,root使用者一旦上上傳了此目錄,其他人無法刪除和覆蓋。 詳細: test使用者 屬於 sftp使用者組。 目錄ftp屬於sftp使用者組的test使用者。當然,使用者組sftp還有其他使用者。 root使用者上傳了新的檔案到ftp目錄下。碰到問題

Http multipart/form-data多引數Post方式資料

關於multipart/form-data格式的上傳,網上有大量的解決文章,這裡,我們使用HttpURLConnection 來完成 POST /test HTTP/1.1 Accept-Language: zh-CN,zh;q=0.8 Accept:

C語言 如何用http post方式 json資料

What :C語言 如何用post方式 上傳json資料. Piont:C語言Socket實現HTTP協議,json格式資料組包。 1,C語言Socket實現HTTP POST+json格式資料 按照HTTP協議傳送request。 http POST

使用最原始的http-post方式圖片 工具類已封裝 可直接使用

// 上傳工具類的 .h檔案 #import <Foundation/Foundation.h> @interface IMPhotoPostTool : NSObject + (NSMutableURLRequest *)upload:(NSString *

AJAX POST方式檔案到後臺下載後臺傳來的檔案

ajax 下載 原本ajax是不能下載檔案的,原因:因為response,一般請求瀏覽器是會處理伺服器輸出的response,例如生成png、檔案下載等,然而ajax請求只是個“字元型”的請求,即請求的內容是以文字型別存放的。檔案的下載是以二進位制形式進行的,雖然可以讀取到返

關於requests Post方式檔案

背景 前兩天需要呼叫一個介面,使用post方式上傳檔案。於是使用Python的requests進行傳送post請求,但是一直報伺服器500的錯誤,感覺很納悶,折磨我好久之後才注意到之前使用的post請求只是攜帶一些欄位,而這次是需要向介面上傳檔案。 步驟 先這樣,,,再這樣,,,

檔案通過httppost方法到伺服器

 這實際上是模仿瀏覽器的post行為,問題的提出是本人在做一個企業內部網路的專案的時候,該企業網路與Internet是通過一臺HP-UNIX的伺服器連線的,專案需要經常從網際網路傳送一些文字檔案到內部網路的一臺Web伺服器,我們只能夠通過那臺HP-UNIX的主機進去,當時內網

FastDFS的配置、部署與API使用解讀(2)位元組方式檔案的客戶端程式碼

本文來自 詩商·柳驚鴻 Poechant CSDN部落格,轉載請註明源地址:FastDFS的配置、部署與API使用解讀(2)上傳檔案到FastDFS分散式檔案系統的客戶端程式碼 在閱讀本文之前,請您先通過《FastDFS的配置、部署與API使用解讀(1)Get Start

ASP.NET 利用post方式檔案

幾經努力,終於實現了檔案上傳,不使用asp.net元件,而使用傳統asp檔案模板方式,方法如下: 上傳檔案介面模板:(upfile.htm)HTML如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w

python 通過post方式檔案到php伺服器

看了網上很多程式碼,都沒有說如何具體的使用poster,試了兩天,終於成功了 通過python呼叫php實現了檔案上傳 與大家分享一下:     首先要通過pip安裝poster(easy_install 也是一樣的):

Java的Post方式檔案

不說廢話,直接上程式碼: public void moveWaterMark(String fileName) { try { File imgFile =

php5.6關於curl方式檔案的變化及解決七牛時報file is not specified in multipart的問題

$ch = curl_init (); $fields = $params;         $fields ['file'] = '@' . $file;   curl_setopt ( $ch, CURLOPT_URL, $u

vc++ socket http協議post方法 分塊

host www. UNC ket security mem packet 比較 content 分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net 最近

php使用新浪雲Storage儲存下載檔案建立bucket、Bucket 操作、Object 操作Object 下載操作Object 刪除操作、Object 複製操作生成一個外網能夠訪

<?php //新浪雲 Storage PHP use use sinacloud\sae\Storage as Storage; // 方法一:在新浪雲執行環境中時可以不傳認證資訊,預設會從應用的環境變數中取 $s = new Storage();

SharePoint REST API - 使用REST APIjQuery一個檔案

本篇主要通過兩個程式碼示例來展示如何應用REST API和jQuery上傳檔案到SharePoint。 示例會使用REST介面和jQuery AJAX請求來將一個本地檔案新增到SharePoint文件庫並修改它的一些屬性。主要有以下幾個操作步驟: 1. 使用FileReader API將本地

使用json方式圖片時發現成功後變成下載了json... 或者無法解析到返回的結果集!!!

問題描述:如題 PS:使用Struts框架!!! 解決方案: <result name="typename" type="json"><param name="noCache">true</param><param name="

SpringMVC form表單 一個檔案

前臺.jsp檔案 <body> <!--第一步:引入.js檔案 ajaxSubmit需要jquery.form.js--> <script type="tex

使用MFC的FTP時每次一個檔案後就出錯解決辦法

用MFC的庫寫了個ftp上傳功能,先建立資料夾再上傳檔案,結果發現資料夾可以正常建立好,結果上傳檔案的時候每次只能傳一個檔案,之後程式就產生錯誤中斷。 可以確定的是本地通過其他ftp軟體訪問ftp伺服器是沒問題的,許可權也沒問題,可以建立檔案。 反覆的測試,結果都是隻能上傳