轉發:同事寫的HTTP上傳文件
有關Java中使用FTP上傳文件,之前我有發過郵件
現在說一下“HTTP文件上傳”,也就是在網頁中向WWW服務器上傳文件
要實現HTTP文件上傳,我們必須先了解上傳文件的HTTP請求。
我做了個簡單的程序示范了把HTTP請求的原始數據寫入文件以及如何上傳文件。
用文本編輯器查看該文件即可了解請求的格式
在此基礎上我們就可以提取出上傳文件的名字、文件內容以及原本混合在一起的其他信息。
現在說一下“HTTP文件上傳”,也就是在網頁中向WWW服務器上傳文件
要實現HTTP文件上傳,我們必須先了解上傳文件的HTTP請求。
我做了個簡單的程序示范了把HTTP請求的原始數據寫入文件以及如何上傳文件。
用文本編輯器查看該文件即可了解請求的格式
在此基礎上我們就可以提取出上傳文件的名字、文件內容以及原本混合在一起的其他信息。
up.jsp頁面提供一個表單,可以從這里輸入一般數據和選擇文件并把文件上傳到服務器。
up.jsp程序可以放在OC4J下的任意項目下運行
up.jsp程序可以放在OC4J下的任意項目下運行
注意,<form>標記有一個enctype屬性,屬性值是"MULTIPART/FORM-DATA"。
"MULTIPART/FORM-DATA"是多段數據提交格式,就是說提交的數據不單是字符文本數據
還包括其他比如文件的數據,當提交文件數據時必須要指定這個屬性
但用了這個屬性之后我們將不能用普通的request.getParameter()來取表單數據
必須要用另外的方式來解析"MULTIPART/FORM-DATA"型的數據
"MULTIPART/FORM-DATA"是多段數據提交格式,就是說提交的數據不單是字符文本數據
還包括其他比如文件的數據,當提交文件數據時必須要指定這個屬性
但用了這個屬性之后我們將不能用普通的request.getParameter()來取表單數據
必須要用另外的方式來解析"MULTIPART/FORM-DATA"型的數據
頁面還有個type為file的Input是用來選擇上傳文件的。
up.jsp中的doUpload()方法把request對象的表單原始數據寫入D:\test.txt文件.
doUpload()方法如下
<%!
public void doUpload(HttpServletRequest request) throws IOException
{
PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter("D:\\test.txt")));
ServletInputStream in = request.getInputStream();
doUpload()方法如下
<%!
public void doUpload(HttpServletRequest request) throws IOException
{
PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter("D:\\test.txt")));
ServletInputStream in = request.getInputStream();
int i = in.read();
while (i != -1)
{
pw.print((char) i);
i = in.read();
}
pw.close();
}
%>
選擇上傳一個文本或者其他文件。點擊“提交”按鈕之后,表單就提交了,一起提交的還有上傳的文件。
提交之后會生成一個D:\test.txt文件。
打開test.txt文件,我們可以看到上傳文件的內容和一些上傳的信息了。
while (i != -1)
{
pw.print((char) i);
i = in.read();
}
pw.close();
}
%>
選擇上傳一個文本或者其他文件。點擊“提交”按鈕之后,表單就提交了,一起提交的還有上傳的文件。
提交之后會生成一個D:\test.txt文件。
打開test.txt文件,我們可以看到上傳文件的內容和一些上傳的信息了。
test.txt文件示例:
-----------------------------7d63e71a403a6
Content-Disposition: form-data; name="company"
-----------------------------7d63e71a403a6
Content-Disposition: form-data; name="company"
XX
-----------------------------7d63e71a403a6
Content-Disposition: form-data; name="filename"; filename="D:\Temp\TestFile.txt"
Content-Type: text/plain
-----------------------------7d63e71a403a6
Content-Disposition: form-data; name="filename"; filename="D:\Temp\TestFile.txt"
Content-Type: text/plain
http://211.155.27.112/bbs/showthread.php?s=&threadid=67680
http://www.newhua.com/cfan/200415/usbsetup.rar
liuhui814@tom.com
http://www.zarvadigital.com/eiss/index.jsp
?????????ì!~????±????ü??.
??????????????????????~!!!!
-----------------------------7d63e71a403a6--
http://www.newhua.com/cfan/200415/usbsetup.rar
liuhui814@tom.com
http://www.zarvadigital.com/eiss/index.jsp
?????????ì!~????±????ü??.
??????????????????????~!!!!
-----------------------------7d63e71a403a6--
test.txt文件中出現亂碼是沒有處理中文的緣故
從test.txt文件中我們可以看出
提交的數據以“-----------------------------7d63e71a403a6”形式來分隔
下面列出關于數據的格式和name,等等的一些屬性
數據的Content-Type屬性沒有的話表示普通的字符串數據,如"company"=XX
數據的Content-Type屬性為text/plain則表示格式為文本文件格式,其filename屬性是文件的文件名
當然如果上傳的是圖片的話,Content-Type屬性就是image/gif或者image/jpg
從以上我們可以看出,通過解析test.txt(也就是request流數據)中的數據,就可以提取出我們所需要的數據
把提取出來的數據保存到相應文件,我們就可以實現HTTP的文件上傳
提交的數據以“-----------------------------7d63e71a403a6”形式來分隔
下面列出關于數據的格式和name,等等的一些屬性
數據的Content-Type屬性沒有的話表示普通的字符串數據,如"company"=XX
數據的Content-Type屬性為text/plain則表示格式為文本文件格式,其filename屬性是文件的文件名
當然如果上傳的是圖片的話,Content-Type屬性就是image/gif或者image/jpg
從以上我們可以看出,通過解析test.txt(也就是request流數據)中的數據,就可以提取出我們所需要的數據
把提取出來的數據保存到相應文件,我們就可以實現HTTP的文件上傳
事實上現在有很多第三方的uploadfile組件,都是利用這個原理來實現HTTP文件上傳
相信了解了HTTP文件上傳的原理,大家會在理解文件上傳方面有一定的幫助
在以后要用到HTTP文件上傳功能的地方,就算用的是第三方的類庫
也能夠做到知其然,知其所以然``
PS:請將form的METHOD改用post傳送,用request如果文件太大,會丟失內容.
相信了解了HTTP文件上傳的原理,大家會在理解文件上傳方面有一定的幫助
在以后要用到HTTP文件上傳功能的地方,就算用的是第三方的類庫
也能夠做到知其然,知其所以然``
PS:請將form的METHOD改用post傳送,用request如果文件太大,會丟失內容.