I tried it on both the emulator and a physical device (HTC Hero). Same behavior. 192.168.1.100 is my laptop running Tomcat. There is a servlet with Apache Commons File upload waiting for that multipart file. Works correctly with uploads from a browser (PC & Android).
Thanks, R. On 12/23/2009 10:56 PM, jotobjects wrote: > Are you running this on the emulator? > > Is 192.168.1.100 a different computer on the same router? > > On Dec 22, 4:51 am, Radek Skokan<[email protected]> wrote: > >> Hi, >> >> I'm trying to upload a file from Android to Tomcat server using >> HttpClient and HttpPost. The android-side code is: >> >> HttpClient client = new DefaultHttpClient(); >> >> client.getParams().setParameter("http.socket.timeout", new Integer >> (90000)); // 90 second >> HttpPost httpPost = new >> HttpPost("http://192.168.1.100:8080/ >> mediator/upload"); >> FileEntity entity = new FileEntity(new >> File(filePath), "binary/ >> octet-stream"); >> httpPost.setEntity(entity); >> HttpResponse response = client.execute(httpPost); >> Log.i(TAG, "Upload finished. Status: " + >> response.getStatusLine()); >> client.getConnectionManager().shutdown(); >> >> The result always is "HTTP/1.1 400 Bad Request". >> >> I captured the data sent over the network and it looks like: >> >> >>> POST /mediator/upload HTTP/1.1 >>> Content-Length: 8287 >>> Content-Type: binary/octet-stream >>> Host: 192.168.1.100:8080 >>> Connection: Keep-Alive >>> User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) >>> Expect: 100-Continue >>> >> < HTTP/1.1 100 Continue >> >> < HTTP/1.1 400 Bad Request >> < Server: Apache-Coyote/1.1 >> < Content-Type: text/html;charset=UTF-8 >> < Content-Length: 971 >> < Date: Tue, 22 Dec 2009 12:14:47 GMT >> < Connection: close >> >> I created a simple HTML form for POSTing a file. This works fine from >> browser and the data is different: >> 1) it doesn't use HTTP 100 continue >> 2) Content-Type: multipart/form-data; boundary=---- >> WebKitFormBoundaryDlIVGYpQG46Q46So >> >> In my client I tried to change the content type to other values than >> "binary/octet-stream", but when I sniff the traffic, the binary/octet- >> stream is still there. >> >> I do this on HTC Here/SDK 1.5. >> >> Thanks, >> Radek >> >> On Nov 15, 11:46 am, rezar<[email protected]> wrote: >> >> >>> I solved the problem. I post my code here for others to have a working >>> sample: >>> on the server side I made a simple servlet: >>> ------------------------------------------------------------------------------------------------------------------------------------------------------------------ >>> private void receiveFile(HttpServletRequest req, HttpServletResponse >>> resp) throws Exception { >>> Enumeration emns = req.getHeaderNames(); >>> InputStream is = req.getInputStream(); >>> OutputStream os = new >>> FileOutputStream(req.getHeader(FILENAME_STR)); >>> byte[] buffer = new byte[4096]; >>> int bytesRead; >>> while ((bytesRead = is.read(buffer)) != -1) { >>> os.write(buffer, 0, bytesRead); >>> } >>> is.close(); >>> os.close(); >>> } >>> protected void doPost(HttpServletRequest request,HttpServletResponse >>> response) throws ServletException, IOException { >>> try { >>> receiveFile(request,response); >>> } catch (Exception e) { >>> >>> System.err.println("------------ERROR---------"+e.getMessage()); >>> e.printStackTrace(); >>> } >>> } >>> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ >>> At the android side (SDK v.2.0 ): >>> private HttpPost post; >>> public void doUpload(String filepath,String filename) { >>> HttpClient httpClient = new DefaultHttpClient(); >>> try { >>> >>> httpClient.getParams().setParameter("http.socket.timeout", new >>> Integer(90000)); // 90 second >>> post = new HttpPost(new URI(YOUR_SERVER_ADDRESS)); >>> File file = new File(filepath); >>> FileEntity entity; >>> if (filepath.substring(filepath.length()-3, >>> filepath.length >>> ()).equalsIgnoreCase("txt") || >>> filepath.substring(filepath.length()-3, >>> filepath.length >>> ()).equalsIgnoreCase("log")) { >>> entity = new FileEntity(file,"text/plain; >>> charset=\"UTF-8\""); >>> entity.setChunked(true); >>> }else { >>> entity = new >>> FileEntity(file,"binary/octet-stream"); >>> entity.setChunked(true); >>> } >>> post.setEntity(entity); >>> post.addHeader(FILENAME_STR, filename); >>> >> >>> HttpResponse response = httpClient.execute(post); >>> if (response.getStatusLine().getStatusCode() != >>> HttpStatus.SC_OK) { >>> Log.e(TAG,"--------Error--------Response >>> Status line >>> code:"+response.getStatusLine()); >>> }else { >>> // Here every thing is fine. >>> } >>> HttpEntity resEntity = response.getEntity(); >>> if (resEntity == null) { >>> Log.e(TAG,"---------Error No Response >>> !!!-----"); >>> } >>> } catch (Exception ex) { >>> Log.e(TAG,"---------Error-----"+ex.getMessage()); >>> ex.printStackTrace(); >>> } finally { >>> httpClient.getConnectionManager().shutdown(); >>> } >>> } >>> > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

