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

Reply via email to