在頁面裡實現上傳文件不是什麼難事寫個form加上enctype = multipart/formdata在寫個接收的就可以了沒什麼難的如果要用HttpURLConnection來實現文件上傳還真有點搞頭:)
先寫個servlet把接收到的 HTTP 信息保存在一個文件中 看一下 form 表單到底封裝了什麼樣的信息
Java代碼
public void doPost(HttpServletRequest request HttpServletResponse response)
throws ServletException IOException {
//獲取輸入流是HTTP協議中的實體內容
ServletInputStream in=requestgetInputStream();
//緩沖區
byte buffer[]=new byte[];
FileOutputStream out=new FileOutputStream(d:\\testlog);
int len=sisread(buffer );
//把流裡的信息循環讀入到filelog文件中
while( len!= ){
outwrite(buffer len);
len=inreadLine(buffer );
}
outclose();
inclose();
}
來一個form表單
<form name=upform action=uploaddo method=POST
enctype=multipart/formdata>
參數<input type=text name=username/><br/>
文件<input type=file name=file/><br/>
文件<input type=file name=file/><br/>
<input type=submit value=Submit />
<br />
</form>
假如我參數寫的內容是hello word然後二個文件是二個簡單的txt文件上傳後testlog裡如下
Java代碼
daec
ContentDisposition: formdata; name=username
hello word
daec
ContentDisposition: formdata; name=file; filename=D:\hahatxt
ContentType: text/plain
haha
hahaha
daec
ContentDisposition: formdata; name=file; filename=D:\huhutxt
ContentType: text/plain
messi
huhu
daec
研究下規律發現有如下幾點特征
第一行是 dbbc 作為分隔符然後是 \r\n 回車換行符 這個dbbc 分隔符浏覽器是隨機生成的
第二行是ContentDisposition: formdata; name=file; filename=D:\huhutxt;name=對應input的name值filename對應要上傳的文件名(包括路徑在內)
第三行如果是文件就有ContentType: text/plain這裡上傳的是txt文件所以是text/plain如果上穿的是jpg圖片的話就是image/jpg了可以自己試試看看
然後就是回車換行符
在下就是文件或參數的內容或值了如hello word
最後一行是daec注意最後多了二個;
有了這些就可以使用HttpURLConnection來實現上傳文件功能了
Java代碼 public void upload(){
List<String> list = new ArrayList<String>(); //要上傳的文件名如d:\hahadoc你要實現自己的業務我這裡就是一個空list
try {
String BOUNDARY = dadc; // 定義數據分隔線
URL url = new URL();
HttpURLConnection conn = (HttpURLConnection) urlopenConnection();
// 發送POST請求必須設置如下兩行
connsetDoOutput(true);
connsetDoInput(true);
connsetUseCaches(false);
connsetRequestMethod(POST);
connsetRequestProperty(connection KeepAlive);
connsetRequestProperty(useragent Mozilla/ (compatible; MSIE ; Windows NT ; SV));
connsetRequestProperty(Charsert UTF);
connsetRequestProperty(ContentType multipart/formdata; boundary= + BOUNDARY);
OutputStream out = new DataOutputStream(conngetOutputStream());
byte[] end_data = (\r\n + BOUNDARY + \r\n)getBytes();// 定義最後數據分隔線
int leng = listsize();
for(int i=;i<leng;i++){
String fname = listget(i);
File file = new File(fname);
StringBuilder sb = new StringBuilder();
sbappend();
sbappend(BOUNDARY);
sbappend(\r\n);
sbappend(ContentDisposition: formdata;name=\file+i+\;filename=\+ filegetName() + \\r\n);
sbappend(ContentType:application/octetstream\r\n\r\n);
byte[] data = sbtoString()getBytes();
outwrite(data);
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = ;
byte[] bufferOut = new byte[];
while ((bytes = inread(bufferOut)) != ) {
outwrite(bufferOut bytes);
}
outwrite(\r\ngetBytes()); //多個文件時二個文件之間加入這個
inclose();
}
outwrite(end_data);
outflush();
outclose();
// 定義BufferedReader輸入流來讀取URL的響應
BufferedReader reader = new BufferedReader(new InputStreamReader(conngetInputStream()));
String line = null;
while ((line = readerreadLine()) != null) {
Systemoutprintln(line);
}
} catch (Exception e) {
Systemoutprintln(發送POST請求出現異常! + e);
eprintStackTrace();
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27114.html