透過 http 協議上傳檔案(rfc1867協議概述,jsp 應用舉例,客戶端傳送內容構造) (轉)
透過 http
1867協議概述, 應用舉例,客戶端傳送內容構造
1、概述
在最初的 http 協議中,沒有上傳檔案方面的功能。 rfc1867 () 為 http 協議新增了這個功能。客戶端的,如 IE, Mozila, Opera 等,按照此規範將指定的檔案傳送到。伺服器端的網頁,如 , , jsp 等,可以按照此規範,解析出使用者傳送來的檔案。
Microsoft IE, Mozila, Opera 已經支援此協議,在網頁中使用一個特殊的 fo就可以傳送檔案。
絕大部分 http server ,包括 ,已經支援此協議,可接受傳送來的檔案。
各種網頁程式,如 php, asp, jsp 中,對於上傳檔案已經做了很好的封裝。
2、上傳檔案的例項:用 servelet 實現(http server 為 tomcat 4.1.24)
1. 在一個 html 網頁中,寫一個如下的form :
使用者可以選擇多個檔案,填寫表單其它項,點選“提交”按鈕後就開始上傳給 http://192.168.29.65/upload_file/UploadFile 這是一個 servelet 程式
注意 enctype="multipart/form-data", method=post, type="file" 。根據 rfc1867, 這三個屬性是必須的。multipart/form-data 是新增的編碼型別,以提高二進位制檔案的傳輸。具體的解釋請參閱 rfc1867
2. 服務端 servelet 的編寫
現在第三方的 http upload file 工具庫很多。Jarkata 專案本身就提供了fileupload 包.org/commons/fileupload/"> 。檔案上傳、表單項處理、效率問題基本上都考慮到了。在 中就使用了這個包,不過是用 struts 的方式另行封裝了一次。這裡我們直接使用 fileupload 包。至於struts 中的用法,請參閱 struts 相關文件。
這個處理檔案上傳的 servelet 主要程式碼如下:
public void doPost( HttpRequest 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.iormField() ) {
// 當前是一個表單項
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: /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="pass1"
bar
-----------------------------7d33a816d302b6--
(上面有一個回車)
此內容必須一字不差,包括最後的回車。
注意:Content-Length: 424 這裡的424是紅色內容的總長度(包括最後的回車)
注意這一行:
Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6
根據 rfc1867, multipart/form-data是必須的.
---------------------------7d33a816d302b6 是分隔符,分隔多個檔案、表單項。其中33a816d302b6 是即時生成的一個數字,用以確保整個分隔符不會在檔案或表單項的內容中出現。前面的 ---------------------------7d 是 特有的標誌。 Mozila 為---------------------------71
用手工傳送這個例子,在上述的 servlet 中檢驗透過。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982075/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- jftp通過sftp協議上傳檔案FTP協議
- php通過ftp協議上傳檔案PHPFTP協議
- linux下遠端傳送檔案命令,通過ssh協議傳輸檔案Linux協議
- http協議內容HTTP協議
- HTTP協議概述HTTP協議
- 修改CAS客戶端 使用簡單HTTP協議客戶端HTTP協議
- 4種傳輸協議設定,檔案傳輸協議如何選擇?協議
- 客戶端和伺服器透過http協議基於》》tcp協議,經過三次握手進行socket連線客戶端伺服器HTTP協議TCP
- HTTP超文字傳輸協議HTTP協議
- Raysync檔案傳輸協議(FTP)協議FTP
- 檔案傳輸協議介紹協議
- FreeBSD超文字傳輸協議HTTP(轉)協議HTTP
- IM客戶端Socks 5代理協議應用客戶端協議
- Java用HttpClient3傳送http/https協議get/post請求,傳送map,jsoJavaHTTPclient協議JS
- 【轉載】MySQL客戶端伺服器協議MySql客戶端伺服器協議
- ICAP: 互換客戶端地址協議客戶端協議
- ntp協議及客戶端開發協議客戶端
- web應用與http協議WebHTTP協議
- 支援斷點續傳的大檔案傳輸協議斷點協議
- 還在使用檔案傳輸協議傳輸機密檔案?你可能是對檔案傳輸協議有什麼誤會協議
- HTTP的協議頭內容的認識HTTP協議
- SMTP協議解讀以及如何使用SMTP協議傳送電子郵件協議
- 檔案傳輸協議的五種安全檔案傳輸替代方案協議
- 21_MQTT協議_客戶端和服務端MQQT協議客戶端服務端
- 傳輸層協議協議
- RVP:存在和即時訊息傳送協議 (3) (轉)協議
- RVP:存在和即時訊息傳送協議 (2) (轉)協議
- Python模組學習:httplib HTTP協議客戶端實現PythonHTTP協議客戶端
- Shimo mac(多協議VPN客戶端工具)5.0.4啟用Mac協議客戶端
- 常用物聯網應用層協議(1)——先說HTTP協議協議HTTP
- RTSP協議、RTMP協議、HTTP協議的區別協議HTTP
- Java用HttpClient3傳送http/https協議get/post請求,傳送map,json,xml,txt資料JavaHTTPclient協議JSONXML
- HTTP 協議HTTP協議
- [HTTP協議]HTTP協議
- http協議HTTP協議
- 網路傳輸協議協議
- 超文字傳輸協議協議
- 【傳輸協議】http協議GET與POST傳遞資料的最大長度能夠達到多少協議HTTP