2010-09-20 54 views
1

我試圖讓我的android手機連接到我的servlet併發送給它一個特定的圖像。我認爲我會這樣做的方式是使用copyPixelsToBuffer()函數,然後嘗試通過一些輸出流將其發送到servlet(類似於我在常規獨立Java應用程序中的做法)。這種方式會工作嗎?如果是這樣,我準確使用什麼樣的流?我應該用DataOutputStream類,只是做一些這樣的:可能將圖像作爲字節緩衝區發送到我的Servlet?

ByteBuffer imgbuff; 
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
bm.copyPixelsToBuffer(bm); 

...code... 
URLConnection sc = server.openConnection(); 
sc.setDoOutput(true); 

DataOutputStream out = new DataOutputStream(sc.getOutputStream()); 
out.write(imgbuff.array()); 
out.flush(); 
out.close(); 

注:據我所知,這可能不是使用Android操作系統連接到服務器的正確方法,但目前我的工作只是如何發送圖像,而不是連接(除非這與圖像的發送方式有關)。

如果這不是你建議將圖像發送到servlet的方式(我認爲字節緩衝區最好,但我可能是錯的),你會如何推薦這樣做?

回答

2

由於HttpServlet通常監聽HTTP請求,所以您希望使用multipart/form-data編碼通過HTTP發送二進制數據,而不是原始(未格式化)。

從客戶端開始,您可以使用URLConnection作爲此mini tutorial中概述的內容,但它會非常冗長。您也可以使用Apache HttpComponents Client。這增加了額外的依賴關係,我不確定你是否希望在Android上擁有它。

然後,在服務器端,您可以使用Apache Commons FileUpload解析multipart/form-data編碼請求主體中的項目。您可以在this answer中找到代碼示例,該servlet的doPost()應該如何。

至於你的代碼示例:包裝在DataOutputStream是不必要的。您沒有使用DataOutputStream的設施。您正在使用write(byte[])方法,該方法已由URLConnection#getOutputStream()返回的基本OutputStream提供。此外,Bitmap有一個compress()方法,您可以使用該方法使用更加標準和可理解的格式(PNG,JPG等)將其壓縮爲任意OutputStream。例如。

output = connection.getOutputStream(); 
// ... 
bitmap.compress(CompressFormat.JPEG, 100, output); 

這樣做而不是output.write(bytes)與您的代碼一樣。

+0

感謝您的信息,我會研究這些資源。 – Fizz 2010-09-20 22:19:58

+0

不客氣。 – BalusC 2010-09-20 22:22:22