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