首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 手機圖片上傳實戰經驗:HttpConnection 分塊編碼陷阱與 Socket 方案

     編輯:J2ME

HttpConnection 遇到的分塊編碼問題

用 HttpConnection POST 上傳圖片,發現資料被強制採用 chunked 編碼,導致伺服端無法解析(本機測試卻正常)。chunked 僅在資料超過 2016 位元組時觸發。嘗試設定 Content-Length、Connection: close 等 Header 均無效。

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.setRequestMethod(HttpConnection.POST);
os = conn.openOutputStream();
os.write(data);
HttpConnection上傳

圖1:HttpConnection 上傳相關圖片

改用 Socket 模擬 HTTP 協議

參考網友經驗,改用 SocketConnection 手工構造 HTTP/1.1 請求報文,避開 chunked 編碼。構造請求行、Header(Host、Content-Type、Content-Length、Connection: close)、空行、實體資料。測試成功,伺服端可按常規 Web 方式處理,無需特殊解析。

StringBuffer sb = new StringBuffer();
sb.append("POST ").append(URL.query).append(" HTTP/1.1\r\n");
sb.append("Host: ").append(URL.host).append("\r\n");
sb.append("Content-type: application/octet-stream\r\n");
sb.append("Content-Length: ").append(data.length).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);
Socket上傳

圖2:Socket 模擬 HTTP 上傳相關圖片

檔案上傳資料流格式構建亦無問題,服務端代碼與普通 Web 一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved