在頁面里實現(xiàn)上傳文件不是什么難事 寫個form 加上enctype = multipart/form data 在寫個接收的就可以了 沒什么難的 如果要用 HttpURLConnection來實現(xiàn)文件上傳 還真有點搞頭 : )
10多年的門源網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整門源建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“門源網(wǎng)站設(shè)計”,“門源網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
先寫個servlet把接收到的 HTTP 信息保存在一個文件中 看一下 form 表單到底封裝了什么樣的信息
Java代碼
public void doPost(HttpServletRequest request HttpServletResponse response)
throws ServletException IOException {
//獲取輸入流 是HTTP協(xié)議中的實體內(nèi)容
ServletInputStream? in=request getInputStream();
//緩沖區(qū)
byte buffer[]=new byte[ ];
FileOutputStream out=new FileOutputStream( d:\\test log );
int len=sis read(buffer );
//把流里的信息循環(huán)讀入到file log文件中
while( len!= ){
out write(buffer len);
len=in readLine(buffer );
}
out close();
in close();
}
來一個form表單
form name= upform action= upload do method= POST
enctype= multipart/form data
參數(shù)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
假如我參數(shù)寫的內(nèi)容是hello word 然后二個文件是二個簡單的txt文件 上傳后test log里如下
Java代碼
da e c
Content Disposition: form data; name= username
hello word
da e c
Content Disposition: form data; name= file ; filename= D:\haha txt
Content Type: text/plain
haha
hahaha
da e c
Content Disposition: form data; name= file ; filename= D:\huhu txt
Content Type: text/plain
messi
huhu
da e c
研究下規(guī)律發(fā)現(xiàn)有如下幾點特征
第一行是 d b bc 作為分隔符 然后是 \r\n 回車換行符 這個 d b bc 分隔符瀏覽器是隨機生成的
第二行是Content Disposition: form data; name= file ; filename= D:\huhu txt ;name=對應(yīng)input的name值 filename對應(yīng)要上傳的文件名(包括路徑在內(nèi))
第三行如果是文件就有Content Type: text/plain 這里上傳的是txt文件所以是text/plain 如果上穿的是jpg圖片的話就是image/jpg了 可以自己試試看看
然后就是回車換行符
在下就是文件或參數(shù)的內(nèi)容或值了 如 hello word
最后一行是 da e c 注意最后多了二個 ;
有了這些就可以使用HttpURLConnection來實現(xiàn)上傳文件功能了
Java代碼 public void upload(){
ListString list? = new ArrayListString();? //要上傳的文件名 如 d:\haha doc 你要實現(xiàn)自己的業(yè)務(wù) 我這里就是一個空list
try {
String BOUNDARY = d a d c ; // 定義數(shù)據(jù)分隔線
URL url = new URL( );
HttpURLConnection conn = (HttpURLConnection) url openConnection();
// 發(fā)送POST請求必須設(shè)置如下兩行
conn setDoOutput(true);
conn setDoInput(true);
conn setUseCaches(false);
conn setRequestMethod( POST );
conn setRequestProperty( connection Keep Alive );
conn setRequestProperty( user agent Mozilla/ (patible; MSIE ; Windows NT ; SV ) );
conn setRequestProperty( Charsert UTF );
conn setRequestProperty( Content Type multipart/form data; boundary= + BOUNDARY);
OutputStream out = new DataOutputStream(conn getOutputStream());
byte[] end_data = ( \r\n + BOUNDARY + \r\n ) getBytes();// 定義最后數(shù)據(jù)分隔線
int leng = list size();
for(int i= ;ileng;i++){
String fname = list get(i);
File file = new File(fname);
StringBuilder *** = new StringBuilder();
*** append( );
*** append(BOUNDARY);
*** append( \r\n );
*** append( Content Disposition: form data;name=\ file +i+ \ ;filename=\ + file getName() + \ \r\n );
*** append( Content Type:application/octet stream\r\n\r\n );
byte[] data = *** toString() getBytes();
out write(data);
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = ;
byte[] bufferOut = new byte[ ];
while ((bytes = in read(bufferOut)) != ) {
out write(bufferOut bytes);
}
out write( \r\n getBytes()); //多個文件時 二個文件之間加入這個
in close();
}
out write(end_data);
out flush();
out close();
// 定義BufferedReader輸入流來讀取URL的響應(yīng)
BufferedReader reader = new BufferedReader(new InputStreamReader(conn getInputStream()));
String line = null;
while ((line = reader readLine()) != null) {
System out println(line);
}
} catch (Exception e) {
System out println( 發(fā)送POST請求出現(xiàn)異常! + e);
e printStackTrace();
}
lishixinzhi/Article/program/Java/hx/201311/27114
我覺得你這個問題的解決應(yīng)該是你的程序做一次這個網(wǎng)站的登陸,而且這個登陸的動作應(yīng)該是需要發(fā)生在你這段代碼以前,因為你這段代碼的動作其實只是訪問了一下那個網(wǎng)站,但是沒有任何的用戶或者是其他的信息。
一般來說你登陸以后,你會獲得一個token,用那個token就可以讓網(wǎng)站認(rèn)為你已經(jīng)登陸,然后改密碼什么就好辦了。建議你先抓一下IE的包看看是人家的通信是怎么樣的,然后用java做就好了?;蛘呤悄莻€網(wǎng)站有開發(fā)者文檔就最好了。
這是J2EE里面的內(nèi)容,你將form表單里面的URL改為服務(wù)器里面的servlet的訪問URL,服務(wù)器就可以處理html發(fā)過來的請求,然后由servlet跳轉(zhuǎn)到原來訪問網(wǎng)頁,并將處理好的數(shù)據(jù)一起發(fā)過來,原來html可以通過AJAX編程來接受來自服務(wù)器的請求,并進行控制顯示?。?!
/**
* 向指定 URL 發(fā)送POST方法的請求
*
* @param url
* 發(fā)送請求的 URL
* @param param
* 請求參數(shù),請求參數(shù)應(yīng)該是 name1=value1name2=value2 的形式。
* @return 所代表遠程資源的響應(yīng)結(jié)果
*/
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打開和URL之間的連接
URLConnection conn = realUrl.openConnection();
// 設(shè)置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 發(fā)送POST請求必須設(shè)置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 獲取URLConnection對象對應(yīng)的輸出流
out = new PrintWriter(conn.getOutputStream());
// 發(fā)送請求參數(shù)
out.print(param);
// flush輸出流的緩沖
out.flush();
// 定義BufferedReader輸入流來讀取URL的響應(yīng)
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("發(fā)送 POST 請求出現(xiàn)異常!"+e);
e.printStackTrace();
}
//使用finally塊來關(guān)閉輸出流、輸入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
個人想法是這樣的 你用的是HttpURLConnection 類
也就是說這個協(xié)議是http協(xié)議
超文本傳輸就是你發(fā)送了一個請求然后服務(wù)器給你答復(fù),所以只要你把包發(fā)出去一定有響應(yīng)
可以不用http請求看看比如只用sockt建立一個
另外有一個URLConnection 就是HttpURLConnection 的父類存在一個setDoInput方法 你看看能不能通過這個來設(shè)置
我的抓包工具不能用所以代碼沒法幫你調(diào)
要不推薦個工具給我吧
這里有整套的Java發(fā)送HTTP請求的代碼,包括Post、Get、Delete、Put、Trace、Head、Options請求方法,鏈接如下:
然后線上實力Demo: