這幾天研究J2ME圖片文件上傳,手機上用FileConnection浏覽文件夾,讀取圖片文件,
然後提交到服務器上的http接口.
首先采用的是 HttpConnection ,發送數據(構建文件上傳方式也一樣), 發現數據都被采用了 chunked 編碼,
服務端什麼內容都獲取不到( 這裡遇到一個奇怪的問題,用我本機做服務端,即使chunked編碼,也能夠完整的獲取到數據),
chunked只有在數據超過2016個字節的時候才會產生.
於是上網搜集資料,發現mingJava的colala實例采用的是將數據切分為 1700 字節大小,循環上傳,直到上傳完畢,
(這裡不知道mingJava是要做進度故意這麼做,還是當時也遇到chunked編碼的問題才這麼做的. hh )
還有網上討論的 http/1.1 http/1.0的問題,好像也是錯誤的.因為用socket數據,設置http/1.1 http/1.0 結果都是一樣的.
conn = (HttpConnection) Connector.open(server,Connector.READ_WRITE,true);
conn.setRequestProperty("Content-Type","application/octet-stream");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
conn.setRequestProperty("Connection","Keep-Alive");
conn.setRequestProperty("Connection","close");
//conn.setRequestProperty("User-Agent", "J2ME/ClIEnt");
conn.setRequestMethod(HttpConnection.POST);
os = conn.openOutputStream();
os.write(data);
所以只好采用socket,模擬http 協議,上傳文件
StringBuffer sb=new StringBuffer();
sb.append("POST ");sb.append(URL.query);sb.append(" HTTP/1.1
");
sb.append("Host: ");sb.append(URL.host);sb.append("
");
sb.append("Content-type: application/octet-stream
");
sb.append("Content-Length: ");sb.append(data.length);sb.append("
");
sb.append("Connection: close
");
sc = (SocketConnection)Connector.open("socket://"+URL.host+":"+URL.port);
is = sc.openInputStream();
os = sc.openOutputStream();
os.write(sb.toString().getBytes());
os.write(data);
經過測試成功,構建文件上傳數據流格式也沒有問題.... 這樣服務端的程序就和web通常的寫法一樣了.不需要做特殊處理了。