用 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);
圖1:HttpConnection 上傳相關圖片
參考網友經驗,改用 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);
圖2:Socket 模擬 HTTP 上傳相關圖片
檔案上傳資料流格式構建亦無問題,服務端代碼與普通 Web 一致。