JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Servlet/JSP 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 HTTP 檔案上傳機制解析 [精華]
精靈





發文: 86
積分: 7
於 2004-07-03 01:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
設計網站,在網頁上直接提供檔案上傳機制是一般常見的功能,比如說:上傳照片、上傳個人網頁等。在這一篇中要說明的不是一般的 FTP 檔案上傳功能,而是指使用 Multipart/form-data protocol,透過 http port,直接將網友電腦上的檔案上傳至 Web Server,Web Server 再透過類似 CGI 機制,接收檔案並加以處理。

Multipart/form-data protocol 說明:
在進行檔案上傳機制的實作說明前,我們先來了解瀏覽器是如何將檔案上傳至 Web Server,先了解此一機制,將有助於程式實作。

瀏覽器透過 http 上傳檔案至 Web Server,是採用標準的 Multipart/form-data 的定義,原始文件定義如下:http://www.faqs.org/rfcs/rfc2388.html。看原始文件有點困難,因為該文件是根基於好幾份 RFC 的定義所衍生而來的,為了讓大家快速了解,在這裡採用實例說明。

當網頁上定義 <form method=”post” enctype="multipart/form-data" action=”xxxxx”> 時,代表告知瀏覽器,在這個網頁上傳資料至 Web Server 時,請採用 Multipart/form-data 規格傳送,當資料傳送到 Web Server 時,Web Server 收到的資料格式如下(綠色字部份):
-----------------------------7d131a26a016a
第一行:boundary (個人稱之為區塊辨識行),是由瀏覽器 Random 產生的一個辨識字串,用來辨識 form 所上傳的所有資料,也用來分隔不同資料。
Content-Disposition: form-data; name="m_uid"
這一行的字串都是固定的,除了 “ “ 中間的字串,指的是網頁上 <input type=”text” name=”m_uid”>,上傳的資訊。

?L?F?}
上一行是 input 的 value,網友在網頁上所輸入的內容,在這裡是使用 ISO8859-1 編碼,所以中文字會變成亂碼,在程式中,必須再加以編碼回 Big5,這樣中文字串才能正常顯示。
-----------------------------7d131a26a016a
第二個區塊開始,在解析資料時,再遇到 boundary 時,代表上一區塊結束,下一區塊開始。
Content-Disposition: form-data; name="m_pwd"
同前所述,是網頁上 <input type=”password” name=”m_pwd”> 欄位上傳的資料。這個欄位網友未輸入任何資料,所以是空白的。

-----------------------------7d131a26a016a
Content-Disposition: form-data; name="up_file"; filename="D:\local\docs\images\banner.gif"
這一行就是 <input type=”file” name=”up_file”> 上傳的資訊,由於是 file type,所以會多出一個 filename 的資訊,CGI 程式就是透過這一行此得此次上傳檔案在網頁電腦上的名稱。
Content-Type: image/gif
這一行會自動根據上傳檔案的副檔名,決定檔案的 Content-Type,有關 Content-Type請參考 MIME 的說明。

( 接下來放的是檔案的實際內容,可能會有很多個 boundary )

-----------------------------7d131a26a016a
Content-Disposition: form-data; name="submit"

?T?w
-----------------------------7d131a26a016a—

boundary 的最後一行,代表上傳資料到此結束,構造上與一般 boundary 字串行有一點不同,在後面會多加 ““,代表上傳結束。

ps:這份文件是剛開始學 Java 時寫的,那時候剛從 ASP 轉 Java Servlet,很驚訝 Java 竟然沒有 FileUpload 的功能,本來想試著自己寫一個模組,後來上網查到了一個 Open Source 的 API,就停止了研究。
有錯誤及不盡之處,歡迎大家補充。


reply to postreply to post
作者 Re:HTTP 檔案上傳機制解析 [Re:精靈]
carny





發文: 78
積分: 0
於 2004-07-07 10:24 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我前陣子也為了這個事情著實煩了一陣子
為的就是讓別人的VB程式將檔案上傳到我的JAVA Server上
(別問我為什麼不用JAVA寫,因為那是專案需要)
在網路上找了幾天才找到有位善心人士用VB把這段程式提供出來
我將他的原始碼放上來給大家參考一下 ^^
但是他的程式直接用的話會發生錯誤
需要改一下
不過我們家老大不允許我將改過的東西放上來
所以要用的話請大家加油囉^^

ps:用JAVA當然是用Jakarta-HttpClient就可以囉∼

HTTPRequest)Upload a file to your Web via HTTP.zip (3.96k)


carny edited on 2004-07-07 15:43
reply to postreply to post
作者 Re:HTTP 檔案上傳機制解析 [Re:精靈]
zjhong5423





發文: 1
積分: 0
於 2004-08-06 14:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
HTTPRequest)Upload a file to your Web via HTTP.zip (3.96k)
下载的不能用呀,能不能给我发到 zjhong5423@163.com 呀,先谢谢你了。


reply to postreply to post
作者 Re:HTTP 檔案上傳機制解析 [Re:精靈]
sealw





發文: 1
積分: 0
於 2004-11-02 16:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
上面所发的zip示例, 二进制文件上传有问题. 改成直接按byte array读入文件,再拼成一个http request即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Open strFileName2 For Binary As #nFile
ReDim fileData(LOF(nFile)) As Byte
Get #nFile, , fileData
Close #nFile
 
oHttp.open "POST", "http://localhost:8080/ExcelUpload/upload.jsp", False
oHttp.setRequestHeader "Content-Type", "multipart/form-data; boundary=AaB03x"
 
strBody = _
   "--AaB03x" & vbCrLf & _
   "Content-Disposition: form-data; name=""path""" & vbCrLf & vbCrLf & _
   "/upload/" & vbCrLf & _
   "--AaB03x" & vbCrLf & _
   "Content-Disposition: form-data; name=""FILE""; filename=""" & strFileName2 & """" & vbCrLf & _
   "Content-Type: application/octet-stream" & vbCrLf & vbCrLf
   
headData = StrConv(strBody, vbFromUnicode)
strBody = vbCrLf & "--AaB03x--"
tailData = StrConv(strBody, vbFromUnicode)
 
ReDim aPostData(UBound(headData) + UBound(fileData) + UBound(tailData) + 4) As Byte
Dim j, i As Long
j = 0
 
For i = 0 To UBound(headData)
  aPostData(j) = headData(i)
  j = j + 1
Next
 
For i = 0 To UBound(fileData)
  aPostData(j) = fileData(i)
  j = j + 1
Next
 
For i = 0 To UBound(tailData)
  aPostData(j) = tailData(i)
  j = j + 1
Next
 
'send it
oHttp.send aPostData


snpshu edited on 2004-11-03 12:25
reply to postreply to post
» JWorld@TW »  Servlet/JSP 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8