註冊 | 登入 | 全文檢索 | 排行榜 |
![]() |
» JWorld@TW
» Servlet/JSP 討論區
![]() ![]() |
![]() ![]() ![]() ![]() |
本主題所含的標籤 |
作者 | HTTP 檔案上傳機制解析 [精華] |
精靈
![]() ![]() ![]() ![]() ![]() ![]() 發文: 86 積分: 7 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 設計網站,在網頁上直接提供檔案上傳機制是一般常見的功能,比如說:上傳照片、上傳個人網頁等。在這一篇中要說明的不是一般的 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,就停止了研究。 有錯誤及不盡之處,歡迎大家補充。 ![]() ![]() |
作者 | Re:HTTP 檔案上傳機制解析 [Re:精靈] |
carny
![]() ![]() ![]() ![]() ![]() ![]() 發文: 78 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 我前陣子也為了這個事情著實煩了一陣子 為的就是讓別人的VB程式將檔案上傳到我的JAVA Server上 (別問我為什麼不用JAVA寫,因為那是專案需要) 在網路上找了幾天才找到有位善心人士用VB把這段程式提供出來 我將他的原始碼放上來給大家參考一下 ^^ 但是他的程式直接用的話會發生錯誤 需要改一下 不過我們家老大不允許我將改過的東西放上來 所以要用的話請大家加油囉^^ ps:用JAVA當然是用Jakarta-HttpClient就可以囉∼ ![]() ![]() ![]() |
作者 | Re:HTTP 檔案上傳機制解析 [Re:精靈] |
zjhong5423
![]() ![]() ![]() ![]() ![]() ![]() 發文: 1 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() HTTPRequest)Upload a file to your Web via HTTP.zip (3.96k) 下载的不能用呀,能不能给我发到 zjhong5423@163.com 呀,先谢谢你了。 ![]() ![]() |
» JWorld@TW » Servlet/JSP 討論區 |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() |